Index: net/socket/tcp_client_socket_unittest.cc |
diff --git a/net/socket/tcp_client_socket_unittest.cc b/net/socket/tcp_client_socket_unittest.cc |
index 1c39719f59d421bf821fc05ee29e6adf8903bcde..92d59ffe87e9cd04f67f9fceed3f9d11a0f71ec9 100644 |
--- a/net/socket/tcp_client_socket_unittest.cc |
+++ b/net/socket/tcp_client_socket_unittest.cc |
@@ -8,13 +8,20 @@ |
#include "net/socket/tcp_client_socket.h" |
+#include <stddef.h> |
+ |
#include "net/base/ip_address.h" |
#include "net/base/ip_endpoint.h" |
#include "net/base/net_errors.h" |
+#include "net/base/socket_performance_watcher.h" |
#include "net/base/test_completion_callback.h" |
#include "net/socket/tcp_server_socket.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+namespace base { |
+class TimeDelta; |
+} |
+ |
namespace net { |
namespace { |
@@ -29,7 +36,8 @@ TEST(TCPClientSocketTest, BindLoopbackToLoopback) { |
IPEndPoint server_address; |
ASSERT_EQ(OK, server.GetLocalAddress(&server_address)); |
- TCPClientSocket socket(AddressList(server_address), NULL, NetLog::Source()); |
+ TCPClientSocket socket(AddressList(server_address), NULL, NULL, |
+ NetLog::Source()); |
EXPECT_EQ(OK, socket.Bind(IPEndPoint(lo_address, 0))); |
@@ -61,7 +69,7 @@ TEST(TCPClientSocketTest, BindLoopbackToLoopback) { |
TEST(TCPClientSocketTest, BindLoopbackToExternal) { |
IPAddress external_ip(72, 14, 213, 105); |
TCPClientSocket socket(AddressList::CreateFromIPAddress(external_ip, 80), |
- NULL, NetLog::Source()); |
+ NULL, NULL, NetLog::Source()); |
EXPECT_EQ(OK, socket.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0))); |
@@ -89,7 +97,8 @@ TEST(TCPClientSocketTest, BindLoopbackToIPv6) { |
IPEndPoint server_address; |
ASSERT_EQ(OK, server.GetLocalAddress(&server_address)); |
- TCPClientSocket socket(AddressList(server_address), NULL, NetLog::Source()); |
+ TCPClientSocket socket(AddressList(server_address), NULL, NULL, |
+ NetLog::Source()); |
EXPECT_EQ(OK, socket.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0))); |
@@ -101,6 +110,58 @@ TEST(TCPClientSocketTest, BindLoopbackToIPv6) { |
EXPECT_NE(OK, result); |
} |
+class TestSocketPerformanceWatcher : public SocketPerformanceWatcher { |
+ public: |
+ TestSocketPerformanceWatcher() : connection_changed_count_(0u) {} |
+ ~TestSocketPerformanceWatcher() override {} |
+ |
+ bool ShouldNotifyUpdatedRTT() const override { return true; } |
+ |
+ void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {} |
+ |
+ void OnConnectionChanged() override { connection_changed_count_++; } |
+ |
+ size_t connection_changed_count() const { return connection_changed_count_; } |
+ |
+ private: |
+ size_t connection_changed_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher); |
+}; |
+ |
+// TestSocketPerformanceWatcher requires kernel support for tcp_info struct, and |
+// so it is enabled only on certain platforms. |
+#if defined(TCP_INFO) || defined(OS_LINUX) |
+#define MAYBE_TestSocketPerformanceWatcher TestSocketPerformanceWatcher |
+#else |
+#define MAYBE_TestSocketPerformanceWatcher TestSocketPerformanceWatcher |
+#endif |
+// Tests if the socket performance watcher is notified if the same socket is |
+// used for a different connection. |
+TEST(TCPClientSocketTest, MAYBE_TestSocketPerformanceWatcher) { |
+ const size_t kNumIPs = 2; |
+ IPAddressList ip_list; |
+ for (size_t i = 0; i < kNumIPs; ++i) |
+ ip_list.push_back(IPAddress(72, 14, 213, i)); |
+ |
+ scoped_ptr<TestSocketPerformanceWatcher> watcher( |
+ new TestSocketPerformanceWatcher()); |
+ TestSocketPerformanceWatcher* watcher_ptr = watcher.get(); |
+ |
+ TCPClientSocket socket( |
+ AddressList::CreateFromIPAddressList(ip_list, "example.com"), |
+ std::move(watcher), NULL, NetLog::Source()); |
+ |
+ EXPECT_EQ(OK, socket.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0))); |
+ |
+ TestCompletionCallback connect_callback; |
+ |
+ ASSERT_NE(OK, connect_callback.GetResult( |
+ socket.Connect(connect_callback.callback()))); |
+ |
+ EXPECT_EQ(kNumIPs - 1, watcher_ptr->connection_changed_count()); |
+} |
+ |
} // namespace |
} // namespace net |