Index: net/socket/tcp_socket_unittest.cc |
diff --git a/net/socket/tcp_socket_unittest.cc b/net/socket/tcp_socket_unittest.cc |
index 4bfc1384fbd93101293d84fa43fcd92fb3ac8f67..2dec25620ff859a786d86ba2a3260b4c9137e35b 100644 |
--- a/net/socket/tcp_socket_unittest.cc |
+++ b/net/socket/tcp_socket_unittest.cc |
@@ -285,5 +285,42 @@ TEST_F(TCPSocketTest, ReadWrite) { |
ASSERT_EQ(message, received_message); |
} |
+TEST_F(TCPSocketTest, ErrorOOBForTCPUrgentData) { |
+ ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
+ |
+ TestCompletionCallback connect_callback; |
+ TCPSocket connecting_socket(NULL, NetLog::Source()); |
+ int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
+ ASSERT_EQ(OK, result); |
+ connecting_socket.Connect(local_address_, connect_callback.callback()); |
+ |
+ TestCompletionCallback accept_callback; |
+ scoped_ptr<TCPSocket> accepted_socket; |
+ IPEndPoint accepted_address; |
+ result = socket_.Accept(&accepted_socket, &accepted_address, |
+ accept_callback.callback()); |
+ ASSERT_EQ(OK, accept_callback.GetResult(result)); |
+ |
+ ASSERT_TRUE(accepted_socket.get()); |
+ |
+ // Both sockets should be on the loopback network interface. |
+ EXPECT_EQ(accepted_address.address(), local_address_.address()); |
+ |
+ EXPECT_EQ(OK, connect_callback.WaitForResult()); |
+ |
+ // Send the TCP urgent data, which is a single byte of OOB data. |
+ char byte = '@'; |
+ ssize_t sent = send(accepted_socket->socket(), &byte, sizeof(byte), MSG_OOB); |
+ ASSERT_EQ(1, sent); |
+ |
+ // Read the urgent data. |
+ scoped_refptr<IOBufferWithSize> buffer(new IOBufferWithSize(8)); |
+ TestCompletionCallback read_callback; |
+ result = connecting_socket.Read(buffer.get(), buffer->size(), |
+ read_callback.callback()); |
+ EXPECT_EQ(ERR_OOB_DATA, result); |
+ EXPECT_EQ(byte, buffer->data()[0]); |
+} |
+ |
} // namespace |
} // namespace net |