OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_server_socket.h" | 5 #include "net/socket/tcp_server_socket.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "net/base/address_list.h" | 13 #include "net/base/address_list.h" |
14 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
15 #include "net/base/ip_endpoint.h" | 15 #include "net/base/ip_endpoint.h" |
16 #include "net/base/net_errors.h" | 16 #include "net/base/net_errors.h" |
17 #include "net/base/test_completion_callback.h" | 17 #include "net/base/test_completion_callback.h" |
18 #include "net/socket/tcp_client_socket.h" | 18 #include "net/socket/tcp_client_socket.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
20 #include "testing/platform_test.h" | 20 #include "testing/platform_test.h" |
21 | 21 |
22 namespace net { | 22 namespace net { |
23 | 23 |
24 namespace { | 24 namespace { |
25 const int kListenBacklog = 5; | 25 const int kListenBacklog = 5; |
26 | 26 |
27 class TCPServerSocketTest : public PlatformTest { | 27 class TCPServerSocketTest : public PlatformTest { |
28 protected: | 28 protected: |
29 TCPServerSocketTest() | 29 TCPServerSocketTest() : socket_(NULL, NetLog::Source()) {} |
30 : socket_(NULL, NetLog::Source()) { | |
31 } | |
32 | 30 |
33 void SetUpIPv4() { | 31 void SetUpIPv4() { |
34 IPEndPoint address; | 32 IPEndPoint address; |
35 ParseAddress("127.0.0.1", 0, &address); | 33 ParseAddress("127.0.0.1", 0, &address); |
36 ASSERT_EQ(OK, socket_.Listen(address, kListenBacklog)); | 34 ASSERT_EQ(OK, socket_.Listen(address, kListenBacklog)); |
37 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 35 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
38 } | 36 } |
39 | 37 |
40 void SetUpIPv6(bool* success) { | 38 void SetUpIPv6(bool* success) { |
41 *success = false; | 39 *success = false; |
42 IPEndPoint address; | 40 IPEndPoint address; |
43 ParseAddress("::1", 0, &address); | 41 ParseAddress("::1", 0, &address); |
44 if (socket_.Listen(address, kListenBacklog) != 0) { | 42 if (socket_.Listen(address, kListenBacklog) != 0) { |
45 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is " | 43 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is " |
46 "disabled. Skipping the test"; | 44 "disabled. Skipping the test"; |
47 return; | 45 return; |
48 } | 46 } |
49 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 47 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
50 *success = true; | 48 *success = true; |
51 } | 49 } |
52 | 50 |
53 void ParseAddress(std::string ip_str, int port, IPEndPoint* address) { | 51 void ParseAddress(std::string ip_str, int port, IPEndPoint* address) { |
54 IPAddressNumber ip_number; | 52 IPAddressNumber ip_number; |
55 bool rv = ParseIPLiteralToNumber(ip_str, &ip_number); | 53 bool rv = ParseIPLiteralToNumber(ip_str, &ip_number); |
56 if (!rv) | 54 if (!rv) |
57 return; | 55 return; |
58 *address = IPEndPoint(ip_number, port); | 56 *address = IPEndPoint(ip_number, port); |
59 } | 57 } |
60 | 58 |
61 static IPEndPoint GetPeerAddress(StreamSocket* socket) { | 59 static IPEndPoint GetPeerAddress(StreamSocket* socket) { |
62 IPEndPoint address; | 60 IPEndPoint address; |
63 EXPECT_EQ(OK, socket->GetPeerAddress(&address)); | 61 EXPECT_EQ(OK, socket->GetPeerAddress(&address)); |
64 return address; | 62 return address; |
65 } | 63 } |
66 | 64 |
67 AddressList local_address_list() const { | 65 AddressList local_address_list() const { return AddressList(local_address_); } |
68 return AddressList(local_address_); | |
69 } | |
70 | 66 |
71 TCPServerSocket socket_; | 67 TCPServerSocket socket_; |
72 IPEndPoint local_address_; | 68 IPEndPoint local_address_; |
73 }; | 69 }; |
74 | 70 |
75 TEST_F(TCPServerSocketTest, Accept) { | 71 TEST_F(TCPServerSocketTest, Accept) { |
76 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 72 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
77 | 73 |
78 TestCompletionCallback connect_callback; | 74 TestCompletionCallback connect_callback; |
79 TCPClientSocket connecting_socket(local_address_list(), | 75 TCPClientSocket connecting_socket( |
80 NULL, NetLog::Source()); | 76 local_address_list(), NULL, NetLog::Source()); |
81 connecting_socket.Connect(connect_callback.callback()); | 77 connecting_socket.Connect(connect_callback.callback()); |
82 | 78 |
83 TestCompletionCallback accept_callback; | 79 TestCompletionCallback accept_callback; |
84 scoped_ptr<StreamSocket> accepted_socket; | 80 scoped_ptr<StreamSocket> accepted_socket; |
85 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 81 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
86 if (result == ERR_IO_PENDING) | 82 if (result == ERR_IO_PENDING) |
87 result = accept_callback.WaitForResult(); | 83 result = accept_callback.WaitForResult(); |
88 ASSERT_EQ(OK, result); | 84 ASSERT_EQ(OK, result); |
89 | 85 |
90 ASSERT_TRUE(accepted_socket.get() != NULL); | 86 ASSERT_TRUE(accepted_socket.get() != NULL); |
91 | 87 |
92 // Both sockets should be on the loopback network interface. | 88 // Both sockets should be on the loopback network interface. |
93 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), | 89 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), |
94 local_address_.address()); | 90 local_address_.address()); |
95 | 91 |
96 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 92 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
97 } | 93 } |
98 | 94 |
99 // Test Accept() callback. | 95 // Test Accept() callback. |
100 TEST_F(TCPServerSocketTest, AcceptAsync) { | 96 TEST_F(TCPServerSocketTest, AcceptAsync) { |
101 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 97 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
102 | 98 |
103 TestCompletionCallback accept_callback; | 99 TestCompletionCallback accept_callback; |
104 scoped_ptr<StreamSocket> accepted_socket; | 100 scoped_ptr<StreamSocket> accepted_socket; |
105 | 101 |
106 ASSERT_EQ(ERR_IO_PENDING, | 102 ASSERT_EQ(ERR_IO_PENDING, |
107 socket_.Accept(&accepted_socket, accept_callback.callback())); | 103 socket_.Accept(&accepted_socket, accept_callback.callback())); |
108 | 104 |
109 TestCompletionCallback connect_callback; | 105 TestCompletionCallback connect_callback; |
110 TCPClientSocket connecting_socket(local_address_list(), | 106 TCPClientSocket connecting_socket( |
111 NULL, NetLog::Source()); | 107 local_address_list(), NULL, NetLog::Source()); |
112 connecting_socket.Connect(connect_callback.callback()); | 108 connecting_socket.Connect(connect_callback.callback()); |
113 | 109 |
114 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 110 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
115 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 111 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
116 | 112 |
117 EXPECT_TRUE(accepted_socket != NULL); | 113 EXPECT_TRUE(accepted_socket != NULL); |
118 | 114 |
119 // Both sockets should be on the loopback network interface. | 115 // Both sockets should be on the loopback network interface. |
120 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), | 116 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), |
121 local_address_.address()); | 117 local_address_.address()); |
122 } | 118 } |
123 | 119 |
124 // Accept two connections simultaneously. | 120 // Accept two connections simultaneously. |
125 TEST_F(TCPServerSocketTest, Accept2Connections) { | 121 TEST_F(TCPServerSocketTest, Accept2Connections) { |
126 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 122 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
127 | 123 |
128 TestCompletionCallback accept_callback; | 124 TestCompletionCallback accept_callback; |
129 scoped_ptr<StreamSocket> accepted_socket; | 125 scoped_ptr<StreamSocket> accepted_socket; |
130 | 126 |
131 ASSERT_EQ(ERR_IO_PENDING, | 127 ASSERT_EQ(ERR_IO_PENDING, |
132 socket_.Accept(&accepted_socket, accept_callback.callback())); | 128 socket_.Accept(&accepted_socket, accept_callback.callback())); |
133 | 129 |
134 TestCompletionCallback connect_callback; | 130 TestCompletionCallback connect_callback; |
135 TCPClientSocket connecting_socket(local_address_list(), | 131 TCPClientSocket connecting_socket( |
136 NULL, NetLog::Source()); | 132 local_address_list(), NULL, NetLog::Source()); |
137 connecting_socket.Connect(connect_callback.callback()); | 133 connecting_socket.Connect(connect_callback.callback()); |
138 | 134 |
139 TestCompletionCallback connect_callback2; | 135 TestCompletionCallback connect_callback2; |
140 TCPClientSocket connecting_socket2(local_address_list(), | 136 TCPClientSocket connecting_socket2( |
141 NULL, NetLog::Source()); | 137 local_address_list(), NULL, NetLog::Source()); |
142 connecting_socket2.Connect(connect_callback2.callback()); | 138 connecting_socket2.Connect(connect_callback2.callback()); |
143 | 139 |
144 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 140 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
145 | 141 |
146 TestCompletionCallback accept_callback2; | 142 TestCompletionCallback accept_callback2; |
147 scoped_ptr<StreamSocket> accepted_socket2; | 143 scoped_ptr<StreamSocket> accepted_socket2; |
148 int result = socket_.Accept(&accepted_socket2, accept_callback2.callback()); | 144 int result = socket_.Accept(&accepted_socket2, accept_callback2.callback()); |
149 if (result == ERR_IO_PENDING) | 145 if (result == ERR_IO_PENDING) |
150 result = accept_callback2.WaitForResult(); | 146 result = accept_callback2.WaitForResult(); |
151 ASSERT_EQ(OK, result); | 147 ASSERT_EQ(OK, result); |
(...skipping 10 matching lines...) Expand all Loading... |
162 local_address_.address()); | 158 local_address_.address()); |
163 } | 159 } |
164 | 160 |
165 TEST_F(TCPServerSocketTest, AcceptIPv6) { | 161 TEST_F(TCPServerSocketTest, AcceptIPv6) { |
166 bool initialized = false; | 162 bool initialized = false; |
167 ASSERT_NO_FATAL_FAILURE(SetUpIPv6(&initialized)); | 163 ASSERT_NO_FATAL_FAILURE(SetUpIPv6(&initialized)); |
168 if (!initialized) | 164 if (!initialized) |
169 return; | 165 return; |
170 | 166 |
171 TestCompletionCallback connect_callback; | 167 TestCompletionCallback connect_callback; |
172 TCPClientSocket connecting_socket(local_address_list(), | 168 TCPClientSocket connecting_socket( |
173 NULL, NetLog::Source()); | 169 local_address_list(), NULL, NetLog::Source()); |
174 connecting_socket.Connect(connect_callback.callback()); | 170 connecting_socket.Connect(connect_callback.callback()); |
175 | 171 |
176 TestCompletionCallback accept_callback; | 172 TestCompletionCallback accept_callback; |
177 scoped_ptr<StreamSocket> accepted_socket; | 173 scoped_ptr<StreamSocket> accepted_socket; |
178 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 174 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
179 if (result == ERR_IO_PENDING) | 175 if (result == ERR_IO_PENDING) |
180 result = accept_callback.WaitForResult(); | 176 result = accept_callback.WaitForResult(); |
181 ASSERT_EQ(OK, result); | 177 ASSERT_EQ(OK, result); |
182 | 178 |
183 ASSERT_TRUE(accepted_socket.get() != NULL); | 179 ASSERT_TRUE(accepted_socket.get() != NULL); |
184 | 180 |
185 // Both sockets should be on the loopback network interface. | 181 // Both sockets should be on the loopback network interface. |
186 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), | 182 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), |
187 local_address_.address()); | 183 local_address_.address()); |
188 | 184 |
189 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 185 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
190 } | 186 } |
191 | 187 |
192 TEST_F(TCPServerSocketTest, AcceptIO) { | 188 TEST_F(TCPServerSocketTest, AcceptIO) { |
193 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 189 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
194 | 190 |
195 TestCompletionCallback connect_callback; | 191 TestCompletionCallback connect_callback; |
196 TCPClientSocket connecting_socket(local_address_list(), | 192 TCPClientSocket connecting_socket( |
197 NULL, NetLog::Source()); | 193 local_address_list(), NULL, NetLog::Source()); |
198 connecting_socket.Connect(connect_callback.callback()); | 194 connecting_socket.Connect(connect_callback.callback()); |
199 | 195 |
200 TestCompletionCallback accept_callback; | 196 TestCompletionCallback accept_callback; |
201 scoped_ptr<StreamSocket> accepted_socket; | 197 scoped_ptr<StreamSocket> accepted_socket; |
202 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 198 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
203 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 199 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
204 | 200 |
205 ASSERT_TRUE(accepted_socket.get() != NULL); | 201 ASSERT_TRUE(accepted_socket.get() != NULL); |
206 | 202 |
207 // Both sockets should be on the loopback network interface. | 203 // Both sockets should be on the loopback network interface. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 bytes_read += read_result; | 238 bytes_read += read_result; |
243 } | 239 } |
244 | 240 |
245 std::string received_message(buffer.begin(), buffer.end()); | 241 std::string received_message(buffer.begin(), buffer.end()); |
246 ASSERT_EQ(message, received_message); | 242 ASSERT_EQ(message, received_message); |
247 } | 243 } |
248 | 244 |
249 } // namespace | 245 } // namespace |
250 | 246 |
251 } // namespace net | 247 } // namespace net |
OLD | NEW |