Index: net/spdy/spdy_proxy_client_socket_unittest.cc |
=================================================================== |
--- net/spdy/spdy_proxy_client_socket_unittest.cc (revision 62460) |
+++ net/spdy/spdy_proxy_client_socket_unittest.cc (working copy) |
@@ -942,10 +942,85 @@ |
AssertConnectSucceeds(); |
+ Run(1); |
+ |
+ ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); |
+ ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); |
+ ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); |
+} |
+ |
+// Read pending when socket is closed should return 0 |
+TEST_F(SpdyProxyClientSocketTest, PendingReadOnCloseReturnsZero) { |
+ scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*conn, 0, false), |
+ }; |
+ |
+ scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 1, true), |
+ MockRead(true, 0, 2), // EOF |
+ }; |
+ |
+ Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
+ |
+ AssertConnectSucceeds(); |
+ |
+ AssertReadStarts(kMsg1, kLen1); |
+ |
+ Run(1); |
+ |
+ ASSERT_EQ(0, read_callback_.WaitForResult()); |
+} |
+ |
+// Reading from a disconnected socket is an error |
+TEST_F(SpdyProxyClientSocketTest, ReadOnDisconnectSocketReturnsNotConnected) { |
+ scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*conn, 0, false), |
+ }; |
+ |
+ scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 1, true), |
+ MockRead(true, 0, 2), // EOF |
+ }; |
+ |
+ Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
+ |
+ AssertConnectSucceeds(); |
+ |
sock_->Disconnect(); |
+ ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Read(NULL, 1, NULL)); |
+} |
+ |
+// Reading buffered data from an already closed socket should return |
+// buffered data, then 0. |
+TEST_F(SpdyProxyClientSocketTest, ReadOnClosedSocketReturnsBufferedData) { |
+ scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*conn, 0, false), |
+ }; |
+ |
+ scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
+ scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 1, true), |
+ CreateMockRead(*msg1, 2, true), |
+ MockRead(true, 0, 3), // EOF |
+ }; |
+ |
+ Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
+ |
+ AssertConnectSucceeds(); |
+ |
+ Run(2); |
+ |
+ AssertSyncReadEquals(kMsg1, kLen1); |
ASSERT_EQ(0, sock_->Read(NULL, 1, NULL)); |
ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); |
+ // Verify that read *still* returns ERR_CONNECTION_CLOSED |
ASSERT_EQ(ERR_CONNECTION_CLOSED, sock_->Read(NULL, 1, NULL)); |
} |
@@ -972,9 +1047,60 @@ |
EXPECT_EQ(ERR_CONNECTION_CLOSED, sock_->Write(buf, buf->size(), NULL)); |
} |
-// ----------- Pending read/write when closed |
+// Calling Write() on a disconnected socket is an error |
+TEST_F(SpdyProxyClientSocketTest, WriteOnDisconnectedSocket) { |
+ scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*conn, 0, false), |
+ }; |
+ scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
+ scoped_ptr<spdy::SpdyFrame> msg1(ConstructBodyFrame(kMsg1, kLen1)); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 1, true), |
+ MockRead(true, 0, 2), // EOF |
+ }; |
+ |
+ Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
+ |
+ AssertConnectSucceeds(); |
+ |
+ sock_->Disconnect(); |
+ |
+ scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
+ EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, sock_->Write(buf, buf->size(), NULL)); |
+} |
+ |
// If the socket is closed with a pending Write(), the callback |
+// should be called with ERR_CONNECTION_CLOSED. |
+TEST_F(SpdyProxyClientSocketTest, WritePendingOnClose) { |
+ scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
+ MockWrite writes[] = { |
+ CreateMockWrite(*conn, 0, false), |
+ MockWrite(true, ERR_IO_PENDING, 2), |
+ }; |
+ |
+ scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
+ MockRead reads[] = { |
+ CreateMockRead(*resp, 1, true), |
+ MockRead(true, 0, 3), // EOF |
+ }; |
+ |
+ Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
+ |
+ AssertConnectSucceeds(); |
+ |
+ EXPECT_TRUE(sock_->IsConnected()); |
+ |
+ scoped_refptr<IOBufferWithSize> buf(CreateBuffer(kMsg1, kLen1)); |
+ EXPECT_EQ(ERR_IO_PENDING, sock_->Write(buf, buf->size(), &write_callback_)); |
+ |
+ Run(1); |
+ |
+ EXPECT_EQ(ERR_CONNECTION_CLOSED, write_callback_.WaitForResult()); |
+} |
+ |
+// If the socket is Disconnected with a pending Write(), the callback |
// should not be called. |
TEST_F(SpdyProxyClientSocketTest, DisconnectWithWritePending) { |
scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
@@ -1004,7 +1130,7 @@ |
EXPECT_FALSE(write_callback_.have_result()); |
} |
-// If the socket is closed with a pending Read(), the callback |
+// If the socket is Disconnected with a pending Read(), the callback |
// should not be called. |
TEST_F(SpdyProxyClientSocketTest, DisconnectWithReadPending) { |
scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |