OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/socket/tcp_socket.h" | 5 #include "net/socket/tcp_socket.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 11 matching lines...) Expand all Loading... |
22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
23 #include "testing/platform_test.h" | 23 #include "testing/platform_test.h" |
24 | 24 |
25 namespace net { | 25 namespace net { |
26 | 26 |
27 namespace { | 27 namespace { |
28 const int kListenBacklog = 5; | 28 const int kListenBacklog = 5; |
29 | 29 |
30 class TCPSocketTest : public PlatformTest { | 30 class TCPSocketTest : public PlatformTest { |
31 protected: | 31 protected: |
32 TCPSocketTest() : socket_(NULL, NetLog::Source()) { | 32 TCPSocketTest() : socket_(NULL, NULL, NetLog::Source()) {} |
33 } | |
34 | 33 |
35 void SetUpListenIPv4() { | 34 void SetUpListenIPv4() { |
36 ASSERT_EQ(OK, socket_.Open(ADDRESS_FAMILY_IPV4)); | 35 ASSERT_EQ(OK, socket_.Open(ADDRESS_FAMILY_IPV4)); |
37 ASSERT_EQ(OK, socket_.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0))); | 36 ASSERT_EQ(OK, socket_.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0))); |
38 ASSERT_EQ(OK, socket_.Listen(kListenBacklog)); | 37 ASSERT_EQ(OK, socket_.Listen(kListenBacklog)); |
39 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 38 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
40 } | 39 } |
41 | 40 |
42 void SetUpListenIPv6(bool* success) { | 41 void SetUpListenIPv6(bool* success) { |
43 *success = false; | 42 *success = false; |
(...skipping 11 matching lines...) Expand all Loading... |
55 | 54 |
56 void TestAcceptAsync() { | 55 void TestAcceptAsync() { |
57 TestCompletionCallback accept_callback; | 56 TestCompletionCallback accept_callback; |
58 scoped_ptr<TCPSocket> accepted_socket; | 57 scoped_ptr<TCPSocket> accepted_socket; |
59 IPEndPoint accepted_address; | 58 IPEndPoint accepted_address; |
60 ASSERT_EQ(ERR_IO_PENDING, | 59 ASSERT_EQ(ERR_IO_PENDING, |
61 socket_.Accept(&accepted_socket, &accepted_address, | 60 socket_.Accept(&accepted_socket, &accepted_address, |
62 accept_callback.callback())); | 61 accept_callback.callback())); |
63 | 62 |
64 TestCompletionCallback connect_callback; | 63 TestCompletionCallback connect_callback; |
65 TCPClientSocket connecting_socket(local_address_list(), | 64 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
66 NULL, NetLog::Source()); | 65 NetLog::Source()); |
67 connecting_socket.Connect(connect_callback.callback()); | 66 connecting_socket.Connect(connect_callback.callback()); |
68 | 67 |
69 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 68 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
70 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 69 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
71 | 70 |
72 EXPECT_TRUE(accepted_socket.get()); | 71 EXPECT_TRUE(accepted_socket.get()); |
73 | 72 |
74 // Both sockets should be on the loopback network interface. | 73 // Both sockets should be on the loopback network interface. |
75 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 74 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
76 } | 75 } |
77 | 76 |
78 AddressList local_address_list() const { | 77 AddressList local_address_list() const { |
79 return AddressList(local_address_); | 78 return AddressList(local_address_); |
80 } | 79 } |
81 | 80 |
82 TCPSocket socket_; | 81 TCPSocket socket_; |
83 IPEndPoint local_address_; | 82 IPEndPoint local_address_; |
84 }; | 83 }; |
85 | 84 |
86 // Test listening and accepting with a socket bound to an IPv4 address. | 85 // Test listening and accepting with a socket bound to an IPv4 address. |
87 TEST_F(TCPSocketTest, Accept) { | 86 TEST_F(TCPSocketTest, Accept) { |
88 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 87 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
89 | 88 |
90 TestCompletionCallback connect_callback; | 89 TestCompletionCallback connect_callback; |
91 // TODO(yzshen): Switch to use TCPSocket when it supports client socket | 90 // TODO(yzshen): Switch to use TCPSocket when it supports client socket |
92 // operations. | 91 // operations. |
93 TCPClientSocket connecting_socket(local_address_list(), | 92 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
94 NULL, NetLog::Source()); | 93 NetLog::Source()); |
95 connecting_socket.Connect(connect_callback.callback()); | 94 connecting_socket.Connect(connect_callback.callback()); |
96 | 95 |
97 TestCompletionCallback accept_callback; | 96 TestCompletionCallback accept_callback; |
98 scoped_ptr<TCPSocket> accepted_socket; | 97 scoped_ptr<TCPSocket> accepted_socket; |
99 IPEndPoint accepted_address; | 98 IPEndPoint accepted_address; |
100 int result = socket_.Accept(&accepted_socket, &accepted_address, | 99 int result = socket_.Accept(&accepted_socket, &accepted_address, |
101 accept_callback.callback()); | 100 accept_callback.callback()); |
102 if (result == ERR_IO_PENDING) | 101 if (result == ERR_IO_PENDING) |
103 result = accept_callback.WaitForResult(); | 102 result = accept_callback.WaitForResult(); |
104 ASSERT_EQ(OK, result); | 103 ASSERT_EQ(OK, result); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 | 141 |
143 TestCompletionCallback accept_callback; | 142 TestCompletionCallback accept_callback; |
144 scoped_ptr<TCPSocket> accepted_socket; | 143 scoped_ptr<TCPSocket> accepted_socket; |
145 IPEndPoint accepted_address; | 144 IPEndPoint accepted_address; |
146 | 145 |
147 ASSERT_EQ(ERR_IO_PENDING, | 146 ASSERT_EQ(ERR_IO_PENDING, |
148 socket_.Accept(&accepted_socket, &accepted_address, | 147 socket_.Accept(&accepted_socket, &accepted_address, |
149 accept_callback.callback())); | 148 accept_callback.callback())); |
150 | 149 |
151 TestCompletionCallback connect_callback; | 150 TestCompletionCallback connect_callback; |
152 TCPClientSocket connecting_socket(local_address_list(), | 151 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
153 NULL, NetLog::Source()); | 152 NetLog::Source()); |
154 connecting_socket.Connect(connect_callback.callback()); | 153 connecting_socket.Connect(connect_callback.callback()); |
155 | 154 |
156 TestCompletionCallback connect_callback2; | 155 TestCompletionCallback connect_callback2; |
157 TCPClientSocket connecting_socket2(local_address_list(), | 156 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, |
158 NULL, NetLog::Source()); | 157 NetLog::Source()); |
159 connecting_socket2.Connect(connect_callback2.callback()); | 158 connecting_socket2.Connect(connect_callback2.callback()); |
160 | 159 |
161 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 160 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
162 | 161 |
163 TestCompletionCallback accept_callback2; | 162 TestCompletionCallback accept_callback2; |
164 scoped_ptr<TCPSocket> accepted_socket2; | 163 scoped_ptr<TCPSocket> accepted_socket2; |
165 IPEndPoint accepted_address2; | 164 IPEndPoint accepted_address2; |
166 | 165 |
167 int result = socket_.Accept(&accepted_socket2, &accepted_address2, | 166 int result = socket_.Accept(&accepted_socket2, &accepted_address2, |
168 accept_callback2.callback()); | 167 accept_callback2.callback()); |
(...skipping 13 matching lines...) Expand all Loading... |
182 } | 181 } |
183 | 182 |
184 // Test listening and accepting with a socket bound to an IPv6 address. | 183 // Test listening and accepting with a socket bound to an IPv6 address. |
185 TEST_F(TCPSocketTest, AcceptIPv6) { | 184 TEST_F(TCPSocketTest, AcceptIPv6) { |
186 bool initialized = false; | 185 bool initialized = false; |
187 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); | 186 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); |
188 if (!initialized) | 187 if (!initialized) |
189 return; | 188 return; |
190 | 189 |
191 TestCompletionCallback connect_callback; | 190 TestCompletionCallback connect_callback; |
192 TCPClientSocket connecting_socket(local_address_list(), | 191 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
193 NULL, NetLog::Source()); | 192 NetLog::Source()); |
194 connecting_socket.Connect(connect_callback.callback()); | 193 connecting_socket.Connect(connect_callback.callback()); |
195 | 194 |
196 TestCompletionCallback accept_callback; | 195 TestCompletionCallback accept_callback; |
197 scoped_ptr<TCPSocket> accepted_socket; | 196 scoped_ptr<TCPSocket> accepted_socket; |
198 IPEndPoint accepted_address; | 197 IPEndPoint accepted_address; |
199 int result = socket_.Accept(&accepted_socket, &accepted_address, | 198 int result = socket_.Accept(&accepted_socket, &accepted_address, |
200 accept_callback.callback()); | 199 accept_callback.callback()); |
201 if (result == ERR_IO_PENDING) | 200 if (result == ERR_IO_PENDING) |
202 result = accept_callback.WaitForResult(); | 201 result = accept_callback.WaitForResult(); |
203 ASSERT_EQ(OK, result); | 202 ASSERT_EQ(OK, result); |
204 | 203 |
205 EXPECT_TRUE(accepted_socket.get()); | 204 EXPECT_TRUE(accepted_socket.get()); |
206 | 205 |
207 // Both sockets should be on the loopback network interface. | 206 // Both sockets should be on the loopback network interface. |
208 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 207 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
209 | 208 |
210 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 209 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
211 } | 210 } |
212 | 211 |
213 TEST_F(TCPSocketTest, ReadWrite) { | 212 TEST_F(TCPSocketTest, ReadWrite) { |
214 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 213 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
215 | 214 |
216 TestCompletionCallback connect_callback; | 215 TestCompletionCallback connect_callback; |
217 TCPSocket connecting_socket(NULL, NetLog::Source()); | 216 TCPSocket connecting_socket(NULL, NULL, NetLog::Source()); |
218 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 217 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
219 ASSERT_EQ(OK, result); | 218 ASSERT_EQ(OK, result); |
220 connecting_socket.Connect(local_address_, connect_callback.callback()); | 219 connecting_socket.Connect(local_address_, connect_callback.callback()); |
221 | 220 |
222 TestCompletionCallback accept_callback; | 221 TestCompletionCallback accept_callback; |
223 scoped_ptr<TCPSocket> accepted_socket; | 222 scoped_ptr<TCPSocket> accepted_socket; |
224 IPEndPoint accepted_address; | 223 IPEndPoint accepted_address; |
225 result = socket_.Accept(&accepted_socket, &accepted_address, | 224 result = socket_.Accept(&accepted_socket, &accepted_address, |
226 accept_callback.callback()); | 225 accept_callback.callback()); |
227 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 226 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 memmove(&buffer[bytes_read], read_buffer->data(), read_result); | 264 memmove(&buffer[bytes_read], read_buffer->data(), read_result); |
266 bytes_read += read_result; | 265 bytes_read += read_result; |
267 } | 266 } |
268 | 267 |
269 std::string received_message(buffer.begin(), buffer.end()); | 268 std::string received_message(buffer.begin(), buffer.end()); |
270 ASSERT_EQ(message, received_message); | 269 ASSERT_EQ(message, received_message); |
271 } | 270 } |
272 | 271 |
273 } // namespace | 272 } // namespace |
274 } // namespace net | 273 } // namespace net |
OLD | NEW |