summaryrefslogtreecommitdiffstats
path: root/net/http/http_network_transaction_spdy3_unittest.cc
diff options
context:
space:
mode:
authorpaivanof@gmail.com <paivanof@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-04 03:25:17 +0000
committerpaivanof@gmail.com <paivanof@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-04 03:25:17 +0000
commit7a5378bafc738902cb8906998e66fc68bd731586 (patch)
treefcfce65d50b40bf9f009799c83ff2070b8905d7c /net/http/http_network_transaction_spdy3_unittest.cc
parent6708dbce1712008b66a55e6260d7410680834bef (diff)
downloadchromium_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.cc87
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),
};