diff options
author | paivanof@gmail.com <paivanof@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-04 03:25:17 +0000 |
---|---|---|
committer | paivanof@gmail.com <paivanof@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-04 03:25:17 +0000 |
commit | 7a5378bafc738902cb8906998e66fc68bd731586 (patch) | |
tree | fcfce65d50b40bf9f009799c83ff2070b8905d7c /net/http/http_network_transaction_spdy3_unittest.cc | |
parent | 6708dbce1712008b66a55e6260d7410680834bef (diff) | |
download | chromium_src-7a5378bafc738902cb8906998e66fc68bd731586.zip chromium_src-7a5378bafc738902cb8906998e66fc68bd731586.tar.gz chromium_src-7a5378bafc738902cb8906998e66fc68bd731586.tar.bz2 |
Treat 0 returned from HttpStream::ReadResponseBody correctly.
According to comment to HttpStream::ReadResponseBody() 0 means end of response
while HttpResponseBodyDrainer treated it as error.
Re-landing the patch -- first attempt revealed bugs and had sub-optimal
implementation.
BUG=154712, 156609
TEST=net_unittests
Review URL: https://chromiumcodereview.appspot.com/11190072
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@165870 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/http/http_network_transaction_spdy3_unittest.cc')
-rw-r--r-- | net/http/http_network_transaction_spdy3_unittest.cc | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/net/http/http_network_transaction_spdy3_unittest.cc b/net/http/http_network_transaction_spdy3_unittest.cc index 5875776..53c58d0 100644 --- a/net/http/http_network_transaction_spdy3_unittest.cc +++ b/net/http/http_network_transaction_spdy3_unittest.cc @@ -1191,6 +1191,89 @@ TEST_F(HttpNetworkTransactionSpdy3Test, NonKeepAliveConnectionEOF) { EXPECT_EQ(ERR_EMPTY_RESPONSE, out.rv); } +// Next 2 cases (KeepAliveEarlyClose and KeepAliveEarlyClose2) are regression +// tests. There was a bug causing HttpNetworkTransaction to hang in the +// destructor in such situations. +// See http://crbug.com/154712 and http://crbug.com/156609. +TEST_F(HttpNetworkTransactionSpdy3Test, KeepAliveEarlyClose) { + HttpRequestInfo request; + request.method = "GET"; + request.url = GURL("http://www.google.com/"); + request.load_flags = 0; + + SessionDependencies session_deps; + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); + scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); + + MockRead data_reads[] = { + MockRead("HTTP/1.0 200 OK\r\n"), + MockRead("Connection: keep-alive\r\n"), + MockRead("Content-Length: 100\r\n\r\n"), + MockRead("hello"), + MockRead(SYNCHRONOUS, 0), + }; + StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); + session_deps.socket_factory.AddSocketDataProvider(&data); + + TestCompletionCallback callback; + + int rv = trans->Start(&request, callback.callback(), BoundNetLog()); + EXPECT_EQ(ERR_IO_PENDING, rv); + + rv = callback.WaitForResult(); + EXPECT_EQ(OK, rv); + + scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(100)); + rv = trans->Read(io_buf, io_buf->size(), callback.callback()); + if (rv == ERR_IO_PENDING) + rv = callback.WaitForResult(); + EXPECT_EQ(5, rv); + rv = trans->Read(io_buf, io_buf->size(), callback.callback()); + EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, rv); + + trans.reset(); + MessageLoop::current()->RunUntilIdle(); + EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); +} + +TEST_F(HttpNetworkTransactionSpdy3Test, KeepAliveEarlyClose2) { + HttpRequestInfo request; + request.method = "GET"; + request.url = GURL("http://www.google.com/"); + request.load_flags = 0; + + SessionDependencies session_deps; + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps)); + scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); + + MockRead data_reads[] = { + MockRead("HTTP/1.0 200 OK\r\n"), + MockRead("Connection: keep-alive\r\n"), + MockRead("Content-Length: 100\r\n\r\n"), + MockRead(SYNCHRONOUS, 0), + }; + StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0); + session_deps.socket_factory.AddSocketDataProvider(&data); + + TestCompletionCallback callback; + + int rv = trans->Start(&request, callback.callback(), BoundNetLog()); + EXPECT_EQ(ERR_IO_PENDING, rv); + + rv = callback.WaitForResult(); + EXPECT_EQ(OK, rv); + + scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(100)); + rv = trans->Read(io_buf, io_buf->size(), callback.callback()); + if (rv == ERR_IO_PENDING) + rv = callback.WaitForResult(); + EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, rv); + + trans.reset(); + MessageLoop::current()->RunUntilIdle(); + EXPECT_EQ(0, GetIdleSocketCountInTransportSocketPool(session.get())); +} + // Test that we correctly reuse a keep-alive connection after not explicitly // reading the body. TEST_F(HttpNetworkTransactionSpdy3Test, KeepAliveAfterUnreadBody) { @@ -7223,6 +7306,7 @@ TEST_F(HttpNetworkTransactionSpdy3Test, UseAlternateProtocolForNpnSpdy) { MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kAlternateProtocolHttpHeader), MockRead("hello world"), + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), MockRead(ASYNC, OK), }; @@ -7311,6 +7395,7 @@ TEST_F(HttpNetworkTransactionSpdy3Test, AlternateProtocolWithSpdyLateBinding) { MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kAlternateProtocolHttpHeader), MockRead("hello world"), + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), MockRead(ASYNC, OK), }; @@ -7426,6 +7511,7 @@ TEST_F(HttpNetworkTransactionSpdy3Test, StallAlternateProtocolForNpnSpdy) { MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kAlternateProtocolHttpHeader), MockRead("hello world"), + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), MockRead(ASYNC, OK), }; @@ -7559,6 +7645,7 @@ TEST_F(HttpNetworkTransactionSpdy3Test, MockRead("HTTP/1.1 200 OK\r\n"), MockRead(kAlternateProtocolHttpHeader), MockRead("hello world"), + MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), MockRead(ASYNC, OK), }; |