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

Side by Side Diff: net/http/http_network_transaction_unittest.cc

Issue 2053133002: Remove MessageLoop::current()->RunUntilIdle() in net. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
« no previous file with comments | « net/http/http_cache_unittest.cc ('k') | net/http/http_stream_factory_impl_request_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/http/http_network_transaction.h" 5 #include "net/http/http_network_transaction.h"
6 6
7 #include <math.h> // ceil 7 #include <math.h> // ceil
8 #include <stdarg.h> 8 #include <stdarg.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 std::string response_data; 293 std::string response_data;
294 int64_t total_received_bytes; 294 int64_t total_received_bytes;
295 int64_t total_sent_bytes; 295 int64_t total_sent_bytes;
296 LoadTimingInfo load_timing_info; 296 LoadTimingInfo load_timing_info;
297 ConnectionAttempts connection_attempts; 297 ConnectionAttempts connection_attempts;
298 IPEndPoint remote_endpoint_after_start; 298 IPEndPoint remote_endpoint_after_start;
299 }; 299 };
300 300
301 void SetUp() override { 301 void SetUp() override {
302 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); 302 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
303 base::MessageLoop::current()->RunUntilIdle(); 303 base::RunLoop().RunUntilIdle();
304 } 304 }
305 305
306 void TearDown() override { 306 void TearDown() override {
307 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); 307 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
308 base::MessageLoop::current()->RunUntilIdle(); 308 base::RunLoop().RunUntilIdle();
309 // Empty the current queue. 309 // Empty the current queue.
310 base::MessageLoop::current()->RunUntilIdle(); 310 base::RunLoop().RunUntilIdle();
311 PlatformTest::TearDown(); 311 PlatformTest::TearDown();
312 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); 312 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
313 base::MessageLoop::current()->RunUntilIdle(); 313 base::RunLoop().RunUntilIdle();
314 } 314 }
315 315
316 NextProto GetProtocol() const { 316 NextProto GetProtocol() const {
317 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2; 317 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2;
318 } 318 }
319 319
320 bool GetDependenciesFromPriority() const { 320 bool GetDependenciesFromPriority() const {
321 return GetParam() == kTestCaseHTTP2PriorityDependencies; 321 return GetParam() == kTestCaseHTTP2PriorityDependencies;
322 } 322 }
323 323
(...skipping 1365 matching lines...) Expand 10 before | Expand all | Expand 10 after
1689 MockRead("hello"), 1689 MockRead("hello"),
1690 MockRead(SYNCHRONOUS, 0), 1690 MockRead(SYNCHRONOUS, 0),
1691 }; 1691 };
1692 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); 1692 StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0);
1693 session_deps_.socket_factory->AddSocketDataProvider(&data); 1693 session_deps_.socket_factory->AddSocketDataProvider(&data);
1694 1694
1695 TestCompletionCallback callback; 1695 TestCompletionCallback callback;
1696 1696
1697 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 1697 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
1698 EXPECT_EQ(ERR_IO_PENDING, rv); 1698 EXPECT_EQ(ERR_IO_PENDING, rv);
1699 base::MessageLoop::current()->RunUntilIdle(); 1699 base::RunLoop().RunUntilIdle();
1700 1700
1701 // Should have deferred for network start. 1701 // Should have deferred for network start.
1702 EXPECT_TRUE(net_start_handler.observed_before_network_start()); 1702 EXPECT_TRUE(net_start_handler.observed_before_network_start());
1703 EXPECT_EQ(LOAD_STATE_WAITING_FOR_DELEGATE, trans->GetLoadState()); 1703 EXPECT_EQ(LOAD_STATE_WAITING_FOR_DELEGATE, trans->GetLoadState());
1704 1704
1705 trans->ResumeNetworkStart(); 1705 trans->ResumeNetworkStart();
1706 rv = callback.WaitForResult(); 1706 rv = callback.WaitForResult();
1707 EXPECT_EQ(OK, rv); 1707 EXPECT_EQ(OK, rv);
1708 EXPECT_TRUE(trans->GetResponseInfo()); 1708 EXPECT_TRUE(trans->GetResponseInfo());
1709 1709
(...skipping 19 matching lines...) Expand all
1729 // Defer on OnBeforeNetworkStart. 1729 // Defer on OnBeforeNetworkStart.
1730 BeforeNetworkStartHandler net_start_handler(true); // defer 1730 BeforeNetworkStartHandler net_start_handler(true); // defer
1731 trans->SetBeforeNetworkStartCallback( 1731 trans->SetBeforeNetworkStartCallback(
1732 base::Bind(&BeforeNetworkStartHandler::OnBeforeNetworkStart, 1732 base::Bind(&BeforeNetworkStartHandler::OnBeforeNetworkStart,
1733 base::Unretained(&net_start_handler))); 1733 base::Unretained(&net_start_handler)));
1734 1734
1735 TestCompletionCallback callback; 1735 TestCompletionCallback callback;
1736 1736
1737 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 1737 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
1738 EXPECT_EQ(ERR_IO_PENDING, rv); 1738 EXPECT_EQ(ERR_IO_PENDING, rv);
1739 base::MessageLoop::current()->RunUntilIdle(); 1739 base::RunLoop().RunUntilIdle();
1740 1740
1741 // Should have deferred for network start. 1741 // Should have deferred for network start.
1742 EXPECT_TRUE(net_start_handler.observed_before_network_start()); 1742 EXPECT_TRUE(net_start_handler.observed_before_network_start());
1743 EXPECT_EQ(LOAD_STATE_WAITING_FOR_DELEGATE, trans->GetLoadState()); 1743 EXPECT_EQ(LOAD_STATE_WAITING_FOR_DELEGATE, trans->GetLoadState());
1744 } 1744 }
1745 1745
1746 // Next 2 cases (KeepAliveEarlyClose and KeepAliveEarlyClose2) are regression 1746 // Next 2 cases (KeepAliveEarlyClose and KeepAliveEarlyClose2) are regression
1747 // tests. There was a bug causing HttpNetworkTransaction to hang in the 1747 // tests. There was a bug causing HttpNetworkTransaction to hang in the
1748 // destructor in such situations. 1748 // destructor in such situations.
1749 // See http://crbug.com/154712 and http://crbug.com/156609. 1749 // See http://crbug.com/154712 and http://crbug.com/156609.
(...skipping 27 matching lines...) Expand all
1777 1777
1778 scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(100)); 1778 scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(100));
1779 rv = trans->Read(io_buf.get(), io_buf->size(), callback.callback()); 1779 rv = trans->Read(io_buf.get(), io_buf->size(), callback.callback());
1780 if (rv == ERR_IO_PENDING) 1780 if (rv == ERR_IO_PENDING)
1781 rv = callback.WaitForResult(); 1781 rv = callback.WaitForResult();
1782 EXPECT_EQ(5, rv); 1782 EXPECT_EQ(5, rv);
1783 rv = trans->Read(io_buf.get(), io_buf->size(), callback.callback()); 1783 rv = trans->Read(io_buf.get(), io_buf->size(), callback.callback());
1784 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, rv); 1784 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, rv);
1785 1785
1786 trans.reset(); 1786 trans.reset();
1787 base::MessageLoop::current()->RunUntilIdle(); 1787 base::RunLoop().RunUntilIdle();
1788 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 1788 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
1789 } 1789 }
1790 1790
1791 TEST_P(HttpNetworkTransactionTest, KeepAliveEarlyClose2) { 1791 TEST_P(HttpNetworkTransactionTest, KeepAliveEarlyClose2) {
1792 HttpRequestInfo request; 1792 HttpRequestInfo request;
1793 request.method = "GET"; 1793 request.method = "GET";
1794 request.url = GURL("http://www.example.org/"); 1794 request.url = GURL("http://www.example.org/");
1795 request.load_flags = 0; 1795 request.load_flags = 0;
1796 1796
1797 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 1797 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
(...skipping 17 matching lines...) Expand all
1815 rv = callback.WaitForResult(); 1815 rv = callback.WaitForResult();
1816 EXPECT_EQ(OK, rv); 1816 EXPECT_EQ(OK, rv);
1817 1817
1818 scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(100)); 1818 scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(100));
1819 rv = trans->Read(io_buf.get(), io_buf->size(), callback.callback()); 1819 rv = trans->Read(io_buf.get(), io_buf->size(), callback.callback());
1820 if (rv == ERR_IO_PENDING) 1820 if (rv == ERR_IO_PENDING)
1821 rv = callback.WaitForResult(); 1821 rv = callback.WaitForResult();
1822 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, rv); 1822 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, rv);
1823 1823
1824 trans.reset(); 1824 trans.reset();
1825 base::MessageLoop::current()->RunUntilIdle(); 1825 base::RunLoop().RunUntilIdle();
1826 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 1826 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
1827 } 1827 }
1828 1828
1829 // Test that we correctly reuse a keep-alive connection after not explicitly 1829 // Test that we correctly reuse a keep-alive connection after not explicitly
1830 // reading the body. 1830 // reading the body.
1831 TEST_P(HttpNetworkTransactionTest, KeepAliveAfterUnreadBody) { 1831 TEST_P(HttpNetworkTransactionTest, KeepAliveAfterUnreadBody) {
1832 HttpRequestInfo request; 1832 HttpRequestInfo request;
1833 request.method = "GET"; 1833 request.method = "GET";
1834 request.url = GURL("http://www.foo.com/"); 1834 request.url = GURL("http://www.foo.com/");
1835 request.load_flags = 0; 1835 request.load_flags = 0;
(...skipping 3020 matching lines...) Expand 10 before | Expand all | Expand 10 after
4856 SSLSocketDataProvider ssl2(ASYNC, OK); 4856 SSLSocketDataProvider ssl2(ASYNC, OK);
4857 ssl2.SetNextProto(GetProtocol()); 4857 ssl2.SetNextProto(GetProtocol());
4858 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); 4858 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2);
4859 4859
4860 TestCompletionCallback callback1; 4860 TestCompletionCallback callback1;
4861 4861
4862 int rv = trans->Start(&request, callback1.callback(), log.bound()); 4862 int rv = trans->Start(&request, callback1.callback(), log.bound());
4863 EXPECT_EQ(ERR_IO_PENDING, rv); 4863 EXPECT_EQ(ERR_IO_PENDING, rv);
4864 4864
4865 // Allow the SpdyProxyClientSocket's write callback to complete. 4865 // Allow the SpdyProxyClientSocket's write callback to complete.
4866 base::MessageLoop::current()->RunUntilIdle(); 4866 base::RunLoop().RunUntilIdle();
4867 // Now allow the read of the response to complete. 4867 // Now allow the read of the response to complete.
4868 spdy_data.Resume(); 4868 spdy_data.Resume();
4869 rv = callback1.WaitForResult(); 4869 rv = callback1.WaitForResult();
4870 EXPECT_EQ(OK, rv); 4870 EXPECT_EQ(OK, rv);
4871 4871
4872 LoadTimingInfo load_timing_info; 4872 LoadTimingInfo load_timing_info;
4873 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); 4873 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info));
4874 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_SSL_TIMES); 4874 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_SSL_TIMES);
4875 4875
4876 const HttpResponseInfo* response = trans->GetResponseInfo(); 4876 const HttpResponseInfo* response = trans->GetResponseInfo();
(...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after
6164 TestCompletionCallback callback1; 6164 TestCompletionCallback callback1;
6165 6165
6166 int rv = trans->Start(&request, callback1.callback(), BoundNetLog()); 6166 int rv = trans->Start(&request, callback1.callback(), BoundNetLog());
6167 EXPECT_EQ(ERR_IO_PENDING, rv); 6167 EXPECT_EQ(ERR_IO_PENDING, rv);
6168 6168
6169 rv = callback1.WaitForResult(); 6169 rv = callback1.WaitForResult();
6170 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv); 6170 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, rv);
6171 6171
6172 // Empty the current queue. This is necessary because idle sockets are 6172 // Empty the current queue. This is necessary because idle sockets are
6173 // added to the connection pool asynchronously with a PostTask. 6173 // added to the connection pool asynchronously with a PostTask.
6174 base::MessageLoop::current()->RunUntilIdle(); 6174 base::RunLoop().RunUntilIdle();
6175 6175
6176 // We now check to make sure the TCPClientSocket was not added back to 6176 // We now check to make sure the TCPClientSocket was not added back to
6177 // the pool. 6177 // the pool.
6178 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 6178 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
6179 trans.reset(); 6179 trans.reset();
6180 base::MessageLoop::current()->RunUntilIdle(); 6180 base::RunLoop().RunUntilIdle();
6181 // Make sure that the socket didn't get recycled after calling the destructor. 6181 // Make sure that the socket didn't get recycled after calling the destructor.
6182 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 6182 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
6183 } 6183 }
6184 6184
6185 // Make sure that we recycle a socket after reading all of the response body. 6185 // Make sure that we recycle a socket after reading all of the response body.
6186 TEST_P(HttpNetworkTransactionTest, RecycleSocket) { 6186 TEST_P(HttpNetworkTransactionTest, RecycleSocket) {
6187 HttpRequestInfo request; 6187 HttpRequestInfo request;
6188 request.method = "GET"; 6188 request.method = "GET";
6189 request.url = GURL("http://www.example.org/"); 6189 request.url = GURL("http://www.example.org/");
6190 request.load_flags = 0; 6190 request.load_flags = 0;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
6224 6224
6225 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 6225 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
6226 6226
6227 std::string response_data; 6227 std::string response_data;
6228 rv = ReadTransaction(trans.get(), &response_data); 6228 rv = ReadTransaction(trans.get(), &response_data);
6229 EXPECT_EQ(OK, rv); 6229 EXPECT_EQ(OK, rv);
6230 EXPECT_EQ("hello world", response_data); 6230 EXPECT_EQ("hello world", response_data);
6231 6231
6232 // Empty the current queue. This is necessary because idle sockets are 6232 // Empty the current queue. This is necessary because idle sockets are
6233 // added to the connection pool asynchronously with a PostTask. 6233 // added to the connection pool asynchronously with a PostTask.
6234 base::MessageLoop::current()->RunUntilIdle(); 6234 base::RunLoop().RunUntilIdle();
6235 6235
6236 // We now check to make sure the socket was added back to the pool. 6236 // We now check to make sure the socket was added back to the pool.
6237 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get())); 6237 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
6238 } 6238 }
6239 6239
6240 // Make sure that we recycle a SSL socket after reading all of the response 6240 // Make sure that we recycle a SSL socket after reading all of the response
6241 // body. 6241 // body.
6242 TEST_P(HttpNetworkTransactionTest, RecycleSSLSocket) { 6242 TEST_P(HttpNetworkTransactionTest, RecycleSSLSocket) {
6243 HttpRequestInfo request; 6243 HttpRequestInfo request;
6244 request.method = "GET"; 6244 request.method = "GET";
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
6284 6284
6285 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 6285 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
6286 6286
6287 std::string response_data; 6287 std::string response_data;
6288 rv = ReadTransaction(trans.get(), &response_data); 6288 rv = ReadTransaction(trans.get(), &response_data);
6289 EXPECT_EQ(OK, rv); 6289 EXPECT_EQ(OK, rv);
6290 EXPECT_EQ("hello world", response_data); 6290 EXPECT_EQ("hello world", response_data);
6291 6291
6292 // Empty the current queue. This is necessary because idle sockets are 6292 // Empty the current queue. This is necessary because idle sockets are
6293 // added to the connection pool asynchronously with a PostTask. 6293 // added to the connection pool asynchronously with a PostTask.
6294 base::MessageLoop::current()->RunUntilIdle(); 6294 base::RunLoop().RunUntilIdle();
6295 6295
6296 // We now check to make sure the socket was added back to the pool. 6296 // We now check to make sure the socket was added back to the pool.
6297 EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get())); 6297 EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get()));
6298 } 6298 }
6299 6299
6300 // Grab a SSL socket, use it, and put it back into the pool. Then, reuse it 6300 // Grab a SSL socket, use it, and put it back into the pool. Then, reuse it
6301 // from the pool and make sure that we recover okay. 6301 // from the pool and make sure that we recover okay.
6302 TEST_P(HttpNetworkTransactionTest, RecycleDeadSSLSocket) { 6302 TEST_P(HttpNetworkTransactionTest, RecycleDeadSSLSocket) {
6303 HttpRequestInfo request; 6303 HttpRequestInfo request;
6304 request.method = "GET"; 6304 request.method = "GET";
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
6350 6350
6351 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 6351 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
6352 6352
6353 std::string response_data; 6353 std::string response_data;
6354 rv = ReadTransaction(trans.get(), &response_data); 6354 rv = ReadTransaction(trans.get(), &response_data);
6355 EXPECT_EQ(OK, rv); 6355 EXPECT_EQ(OK, rv);
6356 EXPECT_EQ("hello world", response_data); 6356 EXPECT_EQ("hello world", response_data);
6357 6357
6358 // Empty the current queue. This is necessary because idle sockets are 6358 // Empty the current queue. This is necessary because idle sockets are
6359 // added to the connection pool asynchronously with a PostTask. 6359 // added to the connection pool asynchronously with a PostTask.
6360 base::MessageLoop::current()->RunUntilIdle(); 6360 base::RunLoop().RunUntilIdle();
6361 6361
6362 // We now check to make sure the socket was added back to the pool. 6362 // We now check to make sure the socket was added back to the pool.
6363 EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get())); 6363 EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get()));
6364 6364
6365 // Now start the second transaction, which should reuse the previous socket. 6365 // Now start the second transaction, which should reuse the previous socket.
6366 6366
6367 trans.reset(new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 6367 trans.reset(new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
6368 6368
6369 rv = trans->Start(&request, callback.callback(), BoundNetLog()); 6369 rv = trans->Start(&request, callback.callback(), BoundNetLog());
6370 6370
6371 EXPECT_EQ(ERR_IO_PENDING, rv); 6371 EXPECT_EQ(ERR_IO_PENDING, rv);
6372 EXPECT_EQ(OK, callback.WaitForResult()); 6372 EXPECT_EQ(OK, callback.WaitForResult());
6373 6373
6374 response = trans->GetResponseInfo(); 6374 response = trans->GetResponseInfo();
6375 ASSERT_TRUE(response); 6375 ASSERT_TRUE(response);
6376 ASSERT_TRUE(response->headers); 6376 ASSERT_TRUE(response->headers);
6377 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 6377 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
6378 6378
6379 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 6379 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
6380 6380
6381 rv = ReadTransaction(trans.get(), &response_data); 6381 rv = ReadTransaction(trans.get(), &response_data);
6382 EXPECT_EQ(OK, rv); 6382 EXPECT_EQ(OK, rv);
6383 EXPECT_EQ("hello world", response_data); 6383 EXPECT_EQ("hello world", response_data);
6384 6384
6385 // Empty the current queue. This is necessary because idle sockets are 6385 // Empty the current queue. This is necessary because idle sockets are
6386 // added to the connection pool asynchronously with a PostTask. 6386 // added to the connection pool asynchronously with a PostTask.
6387 base::MessageLoop::current()->RunUntilIdle(); 6387 base::RunLoop().RunUntilIdle();
6388 6388
6389 // We now check to make sure the socket was added back to the pool. 6389 // We now check to make sure the socket was added back to the pool.
6390 EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get())); 6390 EXPECT_EQ(1, GetIdleSocketCountInSSLSocketPool(session.get()));
6391 } 6391 }
6392 6392
6393 // Make sure that we recycle a socket after a zero-length response. 6393 // Make sure that we recycle a socket after a zero-length response.
6394 // http://crbug.com/9880 6394 // http://crbug.com/9880
6395 TEST_P(HttpNetworkTransactionTest, RecycleSocketAfterZeroContentLength) { 6395 TEST_P(HttpNetworkTransactionTest, RecycleSocketAfterZeroContentLength) {
6396 HttpRequestInfo request; 6396 HttpRequestInfo request;
6397 request.method = "GET"; 6397 request.method = "GET";
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
6437 6437
6438 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); 6438 EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get()));
6439 6439
6440 std::string response_data; 6440 std::string response_data;
6441 rv = ReadTransaction(trans.get(), &response_data); 6441 rv = ReadTransaction(trans.get(), &response_data);
6442 EXPECT_EQ(OK, rv); 6442 EXPECT_EQ(OK, rv);
6443 EXPECT_EQ("", response_data); 6443 EXPECT_EQ("", response_data);
6444 6444
6445 // Empty the current queue. This is necessary because idle sockets are 6445 // Empty the current queue. This is necessary because idle sockets are
6446 // added to the connection pool asynchronously with a PostTask. 6446 // added to the connection pool asynchronously with a PostTask.
6447 base::MessageLoop::current()->RunUntilIdle(); 6447 base::RunLoop().RunUntilIdle();
6448 6448
6449 // We now check to make sure the socket was added back to the pool. 6449 // We now check to make sure the socket was added back to the pool.
6450 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get())); 6450 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
6451 } 6451 }
6452 6452
6453 TEST_P(HttpNetworkTransactionTest, ResendRequestOnWriteBodyError) { 6453 TEST_P(HttpNetworkTransactionTest, ResendRequestOnWriteBodyError) {
6454 std::vector<std::unique_ptr<UploadElementReader>> element_readers; 6454 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
6455 element_readers.push_back( 6455 element_readers.push_back(
6456 base::WrapUnique(new UploadBytesElementReader("foo", 3))); 6456 base::WrapUnique(new UploadBytesElementReader("foo", 3)));
6457 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0); 6457 ElementsUploadDataStream upload_data_stream(std::move(element_readers), 0);
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
6610 6610
6611 const HttpResponseInfo* response = trans->GetResponseInfo(); 6611 const HttpResponseInfo* response = trans->GetResponseInfo();
6612 ASSERT_TRUE(response); 6612 ASSERT_TRUE(response);
6613 6613
6614 // There is no challenge info, since the identity in URL worked. 6614 // There is no challenge info, since the identity in URL worked.
6615 EXPECT_FALSE(response->auth_challenge); 6615 EXPECT_FALSE(response->auth_challenge);
6616 6616
6617 EXPECT_EQ(100, response->headers->GetContentLength()); 6617 EXPECT_EQ(100, response->headers->GetContentLength());
6618 6618
6619 // Empty the current queue. 6619 // Empty the current queue.
6620 base::MessageLoop::current()->RunUntilIdle(); 6620 base::RunLoop().RunUntilIdle();
6621 } 6621 }
6622 6622
6623 // Test the request-challenge-retry sequence for basic auth when there is an 6623 // Test the request-challenge-retry sequence for basic auth when there is an
6624 // incorrect identity in the URL. The identity from the URL should be used only 6624 // incorrect identity in the URL. The identity from the URL should be used only
6625 // once. 6625 // once.
6626 TEST_P(HttpNetworkTransactionTest, WrongAuthIdentityInURL) { 6626 TEST_P(HttpNetworkTransactionTest, WrongAuthIdentityInURL) {
6627 HttpRequestInfo request; 6627 HttpRequestInfo request;
6628 request.method = "GET"; 6628 request.method = "GET";
6629 // Note: the URL has a username:password in it. The password "baz" is 6629 // Note: the URL has a username:password in it. The password "baz" is
6630 // wrong (should be "bar"). 6630 // wrong (should be "bar").
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
6723 6723
6724 response = trans->GetResponseInfo(); 6724 response = trans->GetResponseInfo();
6725 ASSERT_TRUE(response); 6725 ASSERT_TRUE(response);
6726 6726
6727 // There is no challenge info, since the identity worked. 6727 // There is no challenge info, since the identity worked.
6728 EXPECT_FALSE(response->auth_challenge); 6728 EXPECT_FALSE(response->auth_challenge);
6729 6729
6730 EXPECT_EQ(100, response->headers->GetContentLength()); 6730 EXPECT_EQ(100, response->headers->GetContentLength());
6731 6731
6732 // Empty the current queue. 6732 // Empty the current queue.
6733 base::MessageLoop::current()->RunUntilIdle(); 6733 base::RunLoop().RunUntilIdle();
6734 } 6734 }
6735 6735
6736 6736
6737 // Test the request-challenge-retry sequence for basic auth when there is a 6737 // Test the request-challenge-retry sequence for basic auth when there is a
6738 // correct identity in the URL, but its use is being suppressed. The identity 6738 // correct identity in the URL, but its use is being suppressed. The identity
6739 // from the URL should never be used. 6739 // from the URL should never be used.
6740 TEST_P(HttpNetworkTransactionTest, AuthIdentityInURLSuppressed) { 6740 TEST_P(HttpNetworkTransactionTest, AuthIdentityInURLSuppressed) {
6741 HttpRequestInfo request; 6741 HttpRequestInfo request;
6742 request.method = "GET"; 6742 request.method = "GET";
6743 request.url = GURL("http://foo:bar@www.example.org/"); 6743 request.url = GURL("http://foo:bar@www.example.org/");
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
6805 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); 6805 EXPECT_FALSE(trans->IsReadyToRestartForAuth());
6806 6806
6807 response = trans->GetResponseInfo(); 6807 response = trans->GetResponseInfo();
6808 ASSERT_TRUE(response); 6808 ASSERT_TRUE(response);
6809 6809
6810 // There is no challenge info, since the identity worked. 6810 // There is no challenge info, since the identity worked.
6811 EXPECT_FALSE(response->auth_challenge); 6811 EXPECT_FALSE(response->auth_challenge);
6812 EXPECT_EQ(100, response->headers->GetContentLength()); 6812 EXPECT_EQ(100, response->headers->GetContentLength());
6813 6813
6814 // Empty the current queue. 6814 // Empty the current queue.
6815 base::MessageLoop::current()->RunUntilIdle(); 6815 base::RunLoop().RunUntilIdle();
6816 } 6816 }
6817 6817
6818 // Test that previously tried username/passwords for a realm get re-used. 6818 // Test that previously tried username/passwords for a realm get re-used.
6819 TEST_P(HttpNetworkTransactionTest, BasicAuthCacheAndPreauth) { 6819 TEST_P(HttpNetworkTransactionTest, BasicAuthCacheAndPreauth) {
6820 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 6820 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
6821 6821
6822 // Transaction 1: authenticate (foo, bar) on MyRealm1 6822 // Transaction 1: authenticate (foo, bar) on MyRealm1
6823 { 6823 {
6824 HttpRequestInfo request; 6824 HttpRequestInfo request;
6825 request.method = "GET"; 6825 request.method = "GET";
(...skipping 2930 matching lines...) Expand 10 before | Expand all | Expand 10 after
9756 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 9756 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
9757 std::unique_ptr<HttpTransaction> trans( 9757 std::unique_ptr<HttpTransaction> trans(
9758 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 9758 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
9759 9759
9760 StaticSocketDataProvider data; 9760 StaticSocketDataProvider data;
9761 session_deps_.socket_factory->AddSocketDataProvider(&data); 9761 session_deps_.socket_factory->AddSocketDataProvider(&data);
9762 9762
9763 TestCompletionCallback callback; 9763 TestCompletionCallback callback;
9764 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); 9764 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
9765 EXPECT_EQ(ERR_IO_PENDING, rv); 9765 EXPECT_EQ(ERR_IO_PENDING, rv);
9766 base::MessageLoop::current()->RunUntilIdle(); 9766 base::RunLoop().RunUntilIdle();
9767 9767
9768 // Transaction is pending on request body initialization. 9768 // Transaction is pending on request body initialization.
9769 ASSERT_FALSE(fake_reader->callback().is_null()); 9769 ASSERT_FALSE(fake_reader->callback().is_null());
9770 9770
9771 // Return Init()'s result after the transaction gets destroyed. 9771 // Return Init()'s result after the transaction gets destroyed.
9772 trans.reset(); 9772 trans.reset();
9773 fake_reader->callback().Run(OK); // Should not crash. 9773 fake_reader->callback().Run(OK); // Should not crash.
9774 } 9774 }
9775 9775
9776 // Tests that changes to Auth realms are treated like auth rejections. 9776 // Tests that changes to Auth realms are treated like auth rejections.
(...skipping 2509 matching lines...) Expand 10 before | Expand all | Expand 10 after
12286 data.set_connect_data(mock_connect); 12286 data.set_connect_data(mock_connect);
12287 session_deps_.socket_factory->AddSocketDataProvider(&data); 12287 session_deps_.socket_factory->AddSocketDataProvider(&data);
12288 12288
12289 TestCompletionCallback callback; 12289 TestCompletionCallback callback;
12290 12290
12291 BoundTestNetLog log; 12291 BoundTestNetLog log;
12292 int rv = trans->Start(&request, callback.callback(), log.bound()); 12292 int rv = trans->Start(&request, callback.callback(), log.bound());
12293 EXPECT_EQ(ERR_IO_PENDING, rv); 12293 EXPECT_EQ(ERR_IO_PENDING, rv);
12294 trans.reset(); // Cancel the transaction here. 12294 trans.reset(); // Cancel the transaction here.
12295 12295
12296 base::MessageLoop::current()->RunUntilIdle(); 12296 base::RunLoop().RunUntilIdle();
12297 } 12297 }
12298 12298
12299 // Test that if a transaction is cancelled after receiving the headers, the 12299 // Test that if a transaction is cancelled after receiving the headers, the
12300 // stream is drained properly and added back to the socket pool. The main 12300 // stream is drained properly and added back to the socket pool. The main
12301 // purpose of this test is to make sure that an HttpStreamParser can be read 12301 // purpose of this test is to make sure that an HttpStreamParser can be read
12302 // from after the HttpNetworkTransaction and the objects it owns have been 12302 // from after the HttpNetworkTransaction and the objects it owns have been
12303 // deleted. 12303 // deleted.
12304 // See http://crbug.com/368418 12304 // See http://crbug.com/368418
12305 TEST_P(HttpNetworkTransactionTest, CancelAfterHeaders) { 12305 TEST_P(HttpNetworkTransactionTest, CancelAfterHeaders) {
12306 MockRead data_reads[] = { 12306 MockRead data_reads[] = {
(...skipping 26 matching lines...) Expand all
12333 12333
12334 const HttpResponseInfo* response = trans.GetResponseInfo(); 12334 const HttpResponseInfo* response = trans.GetResponseInfo();
12335 ASSERT_TRUE(response); 12335 ASSERT_TRUE(response);
12336 EXPECT_TRUE(response->headers); 12336 EXPECT_TRUE(response->headers);
12337 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 12337 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
12338 12338
12339 // The transaction and HttpRequestInfo are deleted. 12339 // The transaction and HttpRequestInfo are deleted.
12340 } 12340 }
12341 12341
12342 // Let the HttpResponseBodyDrainer drain the socket. 12342 // Let the HttpResponseBodyDrainer drain the socket.
12343 base::MessageLoop::current()->RunUntilIdle(); 12343 base::RunLoop().RunUntilIdle();
12344 12344
12345 // Socket should now be idle, waiting to be reused. 12345 // Socket should now be idle, waiting to be reused.
12346 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get())); 12346 EXPECT_EQ(1, GetIdleSocketCountInTransportSocketPool(session.get()));
12347 } 12347 }
12348 12348
12349 // Test a basic GET request through a proxy. 12349 // Test a basic GET request through a proxy.
12350 TEST_P(HttpNetworkTransactionTest, ProxyGet) { 12350 TEST_P(HttpNetworkTransactionTest, ProxyGet) {
12351 session_deps_.proxy_service = 12351 session_deps_.proxy_service =
12352 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70"); 12352 ProxyService::CreateFixedFromPacResult("PROXY myproxy:70");
12353 BoundTestNetLog log; 12353 BoundTestNetLog log;
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after
13401 13401
13402 // Start the first transaction to set up the SpdySession 13402 // Start the first transaction to set up the SpdySession
13403 HttpRequestInfo request1; 13403 HttpRequestInfo request1;
13404 request1.method = "GET"; 13404 request1.method = "GET";
13405 request1.url = GURL(https_url); 13405 request1.url = GURL(https_url);
13406 request1.load_flags = 0; 13406 request1.load_flags = 0;
13407 HttpNetworkTransaction trans1(LOWEST, session.get()); 13407 HttpNetworkTransaction trans1(LOWEST, session.get());
13408 TestCompletionCallback callback1; 13408 TestCompletionCallback callback1;
13409 EXPECT_EQ(ERR_IO_PENDING, 13409 EXPECT_EQ(ERR_IO_PENDING,
13410 trans1.Start(&request1, callback1.callback(), BoundNetLog())); 13410 trans1.Start(&request1, callback1.callback(), BoundNetLog()));
13411 base::MessageLoop::current()->RunUntilIdle(); 13411 base::RunLoop().RunUntilIdle();
13412 13412
13413 EXPECT_EQ(OK, callback1.WaitForResult()); 13413 EXPECT_EQ(OK, callback1.WaitForResult());
13414 EXPECT_TRUE(trans1.GetResponseInfo()->was_fetched_via_spdy); 13414 EXPECT_TRUE(trans1.GetResponseInfo()->was_fetched_via_spdy);
13415 13415
13416 // Now, start the HTTP request 13416 // Now, start the HTTP request
13417 HttpRequestInfo request2; 13417 HttpRequestInfo request2;
13418 request2.method = "GET"; 13418 request2.method = "GET";
13419 request2.url = GURL(http_url); 13419 request2.url = GURL(http_url);
13420 request2.load_flags = 0; 13420 request2.load_flags = 0;
13421 HttpNetworkTransaction trans2(MEDIUM, session.get()); 13421 HttpNetworkTransaction trans2(MEDIUM, session.get());
13422 TestCompletionCallback callback2; 13422 TestCompletionCallback callback2;
13423 EXPECT_EQ(ERR_IO_PENDING, 13423 EXPECT_EQ(ERR_IO_PENDING,
13424 trans2.Start(&request2, callback2.callback(), BoundNetLog())); 13424 trans2.Start(&request2, callback2.callback(), BoundNetLog()));
13425 base::MessageLoop::current()->RunUntilIdle(); 13425 base::RunLoop().RunUntilIdle();
13426 13426
13427 EXPECT_EQ(OK, callback2.WaitForResult()); 13427 EXPECT_EQ(OK, callback2.WaitForResult());
13428 EXPECT_FALSE(trans2.GetResponseInfo()->was_fetched_via_spdy); 13428 EXPECT_FALSE(trans2.GetResponseInfo()->was_fetched_via_spdy);
13429 } 13429 }
13430 13430
13431 class AltSvcCertificateVerificationTest : public HttpNetworkTransactionTest { 13431 class AltSvcCertificateVerificationTest : public HttpNetworkTransactionTest {
13432 public: 13432 public:
13433 void Run(bool pooling, bool valid) { 13433 void Run(bool pooling, bool valid) {
13434 url::SchemeHostPort server(GURL(valid ? "https://mail.example.org:443" 13434 url::SchemeHostPort server(GURL(valid ? "https://mail.example.org:443"
13435 : "https://invalid.example.org:443")); 13435 : "https://invalid.example.org:443"));
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
13539 std::unique_ptr<HttpTransaction> trans1( 13539 std::unique_ptr<HttpTransaction> trans1(
13540 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 13540 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
13541 HttpRequestInfo request1; 13541 HttpRequestInfo request1;
13542 request1.method = "GET"; 13542 request1.method = "GET";
13543 request1.url = GURL(url1); 13543 request1.url = GURL(url1);
13544 request1.load_flags = 0; 13544 request1.load_flags = 0;
13545 TestCompletionCallback callback1; 13545 TestCompletionCallback callback1;
13546 13546
13547 int rv = trans1->Start(&request1, callback1.callback(), BoundNetLog()); 13547 int rv = trans1->Start(&request1, callback1.callback(), BoundNetLog());
13548 EXPECT_EQ(ERR_IO_PENDING, rv); 13548 EXPECT_EQ(ERR_IO_PENDING, rv);
13549 base::MessageLoop::current()->RunUntilIdle(); 13549 base::RunLoop().RunUntilIdle();
13550 if (data.IsPaused()) 13550 if (data.IsPaused())
13551 data.Resume(); 13551 data.Resume();
13552 rv = callback1.WaitForResult(); 13552 rv = callback1.WaitForResult();
13553 if (valid) { 13553 if (valid) {
13554 EXPECT_EQ(OK, rv); 13554 EXPECT_EQ(OK, rv);
13555 } else { 13555 } else {
13556 if (pooling) { 13556 if (pooling) {
13557 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv); 13557 EXPECT_EQ(ERR_CONNECTION_REFUSED, rv);
13558 } else { 13558 } else {
13559 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv); 13559 EXPECT_EQ(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN, rv);
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
14094 14094
14095 // Now, start the HTTP request 14095 // Now, start the HTTP request
14096 HttpRequestInfo request2; 14096 HttpRequestInfo request2;
14097 request2.method = "GET"; 14097 request2.method = "GET";
14098 request2.url = GURL(url2); 14098 request2.url = GURL(url2);
14099 request2.load_flags = 0; 14099 request2.load_flags = 0;
14100 HttpNetworkTransaction trans2(MEDIUM, session.get()); 14100 HttpNetworkTransaction trans2(MEDIUM, session.get());
14101 TestCompletionCallback callback2; 14101 TestCompletionCallback callback2;
14102 EXPECT_EQ(ERR_IO_PENDING, 14102 EXPECT_EQ(ERR_IO_PENDING,
14103 trans2.Start(&request2, callback2.callback(), BoundNetLog())); 14103 trans2.Start(&request2, callback2.callback(), BoundNetLog()));
14104 base::MessageLoop::current()->RunUntilIdle(); 14104 base::RunLoop().RunUntilIdle();
14105 14105
14106 ASSERT_TRUE(callback2.have_result()); 14106 ASSERT_TRUE(callback2.have_result());
14107 EXPECT_EQ(OK, callback2.WaitForResult()); 14107 EXPECT_EQ(OK, callback2.WaitForResult());
14108 EXPECT_TRUE(trans2.GetResponseInfo()->was_fetched_via_spdy); 14108 EXPECT_TRUE(trans2.GetResponseInfo()->was_fetched_via_spdy);
14109 } 14109 }
14110 14110
14111 // Test to verify that a failed socket read (due to an ERR_CONNECTION_CLOSED 14111 // Test to verify that a failed socket read (due to an ERR_CONNECTION_CLOSED
14112 // error) in SPDY session, removes the socket from pool and closes the SPDY 14112 // error) in SPDY session, removes the socket from pool and closes the SPDY
14113 // session. Verify that new url's from the same HttpNetworkSession (and a new 14113 // session. Verify that new url's from the same HttpNetworkSession (and a new
14114 // SpdySession) do work. http://crbug.com/224701 14114 // SpdySession) do work. http://crbug.com/224701
(...skipping 1989 matching lines...) Expand 10 before | Expand all | Expand 10 after
16104 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); 16104 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0);
16105 session_deps_.socket_factory->AddSocketDataProvider(&data); 16105 session_deps_.socket_factory->AddSocketDataProvider(&data);
16106 session_deps_.channel_id_service.reset(new ChannelIDService( 16106 session_deps_.channel_id_service.reset(new ChannelIDService(
16107 new DefaultChannelIDStore(nullptr), base::ThreadTaskRunnerHandle::Get())); 16107 new DefaultChannelIDStore(nullptr), base::ThreadTaskRunnerHandle::Get()));
16108 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 16108 std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_));
16109 16109
16110 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); 16110 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get());
16111 TestCompletionCallback callback; 16111 TestCompletionCallback callback;
16112 EXPECT_EQ(ERR_IO_PENDING, 16112 EXPECT_EQ(ERR_IO_PENDING,
16113 trans.Start(&request, callback.callback(), BoundNetLog())); 16113 trans.Start(&request, callback.callback(), BoundNetLog()));
16114 base::MessageLoop::current()->RunUntilIdle(); 16114 base::RunLoop().RunUntilIdle();
16115 16115
16116 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); 16116 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy);
16117 HttpRequestHeaders headers; 16117 HttpRequestHeaders headers;
16118 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); 16118 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers));
16119 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); 16119 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding));
16120 } 16120 }
16121 #endif // !defined(OS_IOS) 16121 #endif // !defined(OS_IOS)
16122 16122
16123 } // namespace net 16123 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_cache_unittest.cc ('k') | net/http/http_stream_factory_impl_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698