Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(258)

Side by Side Diff: net/socket/socks5_client_socket_unittest.cc

Issue 582020: Add bounds checking to StaticSocketDataProvider, to make tests more reliable (Closed)
Patch Set: Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/socket/socket_test_util.cc ('k') | net/socket/socks_client_socket_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/socks5_client_socket.h" 5 #include "net/socket/socks5_client_socket.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "net/base/address_list.h" 10 #include "net/base/address_list.h"
(...skipping 14 matching lines...) Expand all
25 namespace net { 25 namespace net {
26 26
27 namespace { 27 namespace {
28 28
29 // Base class to test SOCKS5ClientSocket 29 // Base class to test SOCKS5ClientSocket
30 class SOCKS5ClientSocketTest : public PlatformTest { 30 class SOCKS5ClientSocketTest : public PlatformTest {
31 public: 31 public:
32 SOCKS5ClientSocketTest(); 32 SOCKS5ClientSocketTest();
33 // Create a SOCKSClientSocket on top of a MockSocket. 33 // Create a SOCKSClientSocket on top of a MockSocket.
34 SOCKS5ClientSocket* BuildMockSocket(MockRead reads[], 34 SOCKS5ClientSocket* BuildMockSocket(MockRead reads[],
35 size_t reads_count,
35 MockWrite writes[], 36 MockWrite writes[],
37 size_t writes_count,
36 const std::string& hostname, 38 const std::string& hostname,
37 int port); 39 int port);
38 40
39 virtual void SetUp(); 41 virtual void SetUp();
40 42
41 protected: 43 protected:
42 const uint16 kNwPort; 44 const uint16 kNwPort;
43 scoped_ptr<SOCKS5ClientSocket> user_sock_; 45 scoped_ptr<SOCKS5ClientSocket> user_sock_;
44 AddressList address_list_; 46 AddressList address_list_;
45 ClientSocket* tcp_sock_; 47 ClientSocket* tcp_sock_;
(...skipping 14 matching lines...) Expand all
60 PlatformTest::SetUp(); 62 PlatformTest::SetUp();
61 63
62 // Resolve the "localhost" AddressList used by the TCP connection to connect. 64 // Resolve the "localhost" AddressList used by the TCP connection to connect.
63 HostResolver::RequestInfo info("www.socks-proxy.com", 1080); 65 HostResolver::RequestInfo info("www.socks-proxy.com", 1080);
64 int rv = host_resolver_->Resolve(info, &address_list_, NULL, NULL, NULL); 66 int rv = host_resolver_->Resolve(info, &address_list_, NULL, NULL, NULL);
65 ASSERT_EQ(OK, rv); 67 ASSERT_EQ(OK, rv);
66 } 68 }
67 69
68 SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket( 70 SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket(
69 MockRead reads[], 71 MockRead reads[],
72 size_t reads_count,
70 MockWrite writes[], 73 MockWrite writes[],
74 size_t writes_count,
71 const std::string& hostname, 75 const std::string& hostname,
72 int port) { 76 int port) {
73 TestCompletionCallback callback; 77 TestCompletionCallback callback;
74 data_.reset(new StaticSocketDataProvider(reads, writes)); 78 data_.reset(new StaticSocketDataProvider(reads, reads_count,
79 writes, writes_count));
75 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); 80 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get());
76 81
77 int rv = tcp_sock_->Connect(&callback, NULL); 82 int rv = tcp_sock_->Connect(&callback, NULL);
78 EXPECT_EQ(ERR_IO_PENDING, rv); 83 EXPECT_EQ(ERR_IO_PENDING, rv);
79 rv = callback.WaitForResult(); 84 rv = callback.WaitForResult();
80 EXPECT_EQ(OK, rv); 85 EXPECT_EQ(OK, rv);
81 EXPECT_TRUE(tcp_sock_->IsConnected()); 86 EXPECT_TRUE(tcp_sock_->IsConnected());
82 87
83 return new SOCKS5ClientSocket(tcp_sock_, 88 return new SOCKS5ClientSocket(tcp_sock_,
84 HostResolver::RequestInfo(hostname, port)); 89 HostResolver::RequestInfo(hostname, port));
(...skipping 23 matching lines...) Expand all
108 113
109 MockWrite data_writes[] = { 114 MockWrite data_writes[] = {
110 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), 115 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)),
111 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)), 116 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)),
112 MockWrite(true, payload_write.data(), payload_write.size()) }; 117 MockWrite(true, payload_write.data(), payload_write.size()) };
113 MockRead data_reads[] = { 118 MockRead data_reads[] = {
114 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), 119 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)),
115 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)), 120 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)),
116 MockRead(true, payload_read.data(), payload_read.size()) }; 121 MockRead(true, payload_read.data(), payload_read.size()) };
117 122
118 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 123 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
124 data_writes, arraysize(data_writes),
125 "localhost", 80));
119 126
120 // At this state the TCP connection is completed but not the SOCKS handshake. 127 // At this state the TCP connection is completed but not the SOCKS handshake.
121 EXPECT_TRUE(tcp_sock_->IsConnected()); 128 EXPECT_TRUE(tcp_sock_->IsConnected());
122 EXPECT_FALSE(user_sock_->IsConnected()); 129 EXPECT_FALSE(user_sock_->IsConnected());
123 130
124 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 131 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
125 int rv = user_sock_->Connect(&callback_, log); 132 int rv = user_sock_->Connect(&callback_, log);
126 EXPECT_EQ(ERR_IO_PENDING, rv); 133 EXPECT_EQ(ERR_IO_PENDING, rv);
127 EXPECT_FALSE(user_sock_->IsConnected()); 134 EXPECT_FALSE(user_sock_->IsConnected());
128 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); 135 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 for (int i = 0; i < 2; ++i) { 177 for (int i = 0; i < 2; ++i) {
171 MockWrite data_writes[] = { 178 MockWrite data_writes[] = {
172 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), 179 MockWrite(false, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)),
173 MockWrite(false, request.data(), request.size()) 180 MockWrite(false, request.data(), request.size())
174 }; 181 };
175 MockRead data_reads[] = { 182 MockRead data_reads[] = {
176 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), 183 MockRead(false, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)),
177 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) 184 MockRead(false, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse))
178 }; 185 };
179 186
180 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 187 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
188 data_writes, arraysize(data_writes),
189 hostname, 80));
181 190
182 int rv = user_sock_->Connect(&callback_, NULL); 191 int rv = user_sock_->Connect(&callback_, NULL);
183 EXPECT_EQ(OK, rv); 192 EXPECT_EQ(OK, rv);
184 EXPECT_TRUE(user_sock_->IsConnected()); 193 EXPECT_TRUE(user_sock_->IsConnected());
185 194
186 user_sock_->Disconnect(); 195 user_sock_->Disconnect();
187 EXPECT_FALSE(user_sock_->IsConnected()); 196 EXPECT_FALSE(user_sock_->IsConnected());
188 } 197 }
189 } 198 }
190 199
191 // Test that we fail trying to connect to a hosname longer than 255 bytes. 200 // Test that we fail trying to connect to a hosname longer than 255 bytes.
192 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) { 201 TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) {
193 // Create a string of length 256, where each character is 'x'. 202 // Create a string of length 256, where each character is 'x'.
194 std::string large_host_name; 203 std::string large_host_name;
195 std::fill_n(std::back_inserter(large_host_name), 256, 'x'); 204 std::fill_n(std::back_inserter(large_host_name), 256, 'x');
196 205
197 // Create a SOCKS socket, with mock transport socket. 206 // Create a SOCKS socket, with mock transport socket.
198 MockWrite data_writes[] = {MockWrite()}; 207 MockWrite data_writes[] = {MockWrite()};
199 MockRead data_reads[] = {MockRead()}; 208 MockRead data_reads[] = {MockRead()};
200 user_sock_.reset(BuildMockSocket(data_reads, data_writes, 209 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
210 data_writes, arraysize(data_writes),
201 large_host_name, 80)); 211 large_host_name, 80));
202 212
203 // Try to connect -- should fail (without having read/written anything to 213 // Try to connect -- should fail (without having read/written anything to
204 // the transport socket first) because the hostname is too long. 214 // the transport socket first) because the hostname is too long.
205 TestCompletionCallback callback; 215 TestCompletionCallback callback;
206 int rv = user_sock_->Connect(&callback, NULL); 216 int rv = user_sock_->Connect(&callback, NULL);
207 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); 217 EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv);
208 } 218 }
209 219
210 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) { 220 TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) {
(...skipping 14 matching lines...) Expand all
225 { 235 {
226 const char partial1[] = { 0x05, 0x01 }; 236 const char partial1[] = { 0x05, 0x01 };
227 const char partial2[] = { 0x00 }; 237 const char partial2[] = { 0x00 };
228 MockWrite data_writes[] = { 238 MockWrite data_writes[] = {
229 MockWrite(true, arraysize(partial1)), 239 MockWrite(true, arraysize(partial1)),
230 MockWrite(true, partial2, arraysize(partial2)), 240 MockWrite(true, partial2, arraysize(partial2)),
231 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; 241 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) };
232 MockRead data_reads[] = { 242 MockRead data_reads[] = {
233 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), 243 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)),
234 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; 244 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) };
235 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 245 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
246 data_writes, arraysize(data_writes),
247 hostname, 80));
236 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 248 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
237 int rv = user_sock_->Connect(&callback_, log); 249 int rv = user_sock_->Connect(&callback_, log);
238 EXPECT_EQ(ERR_IO_PENDING, rv); 250 EXPECT_EQ(ERR_IO_PENDING, rv);
239 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); 251 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT));
240 rv = callback_.WaitForResult(); 252 rv = callback_.WaitForResult();
241 EXPECT_EQ(OK, rv); 253 EXPECT_EQ(OK, rv);
242 EXPECT_TRUE(user_sock_->IsConnected()); 254 EXPECT_TRUE(user_sock_->IsConnected());
243 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); 255 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT));
244 } 256 }
245 257
246 // Test for partial greet response read 258 // Test for partial greet response read
247 { 259 {
248 const char partial1[] = { 0x05 }; 260 const char partial1[] = { 0x05 };
249 const char partial2[] = { 0x00 }; 261 const char partial2[] = { 0x00 };
250 MockWrite data_writes[] = { 262 MockWrite data_writes[] = {
251 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), 263 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)),
252 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) }; 264 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) };
253 MockRead data_reads[] = { 265 MockRead data_reads[] = {
254 MockRead(true, partial1, arraysize(partial1)), 266 MockRead(true, partial1, arraysize(partial1)),
255 MockRead(true, partial2, arraysize(partial2)), 267 MockRead(true, partial2, arraysize(partial2)),
256 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; 268 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) };
257 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 269 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
270 data_writes, arraysize(data_writes),
271 hostname, 80));
258 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 272 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
259 int rv = user_sock_->Connect(&callback_, log); 273 int rv = user_sock_->Connect(&callback_, log);
260 EXPECT_EQ(ERR_IO_PENDING, rv); 274 EXPECT_EQ(ERR_IO_PENDING, rv);
261 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); 275 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT));
262 rv = callback_.WaitForResult(); 276 rv = callback_.WaitForResult();
263 EXPECT_EQ(OK, rv); 277 EXPECT_EQ(OK, rv);
264 EXPECT_TRUE(user_sock_->IsConnected()); 278 EXPECT_TRUE(user_sock_->IsConnected());
265 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); 279 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT));
266 } 280 }
267 281
268 // Test for partial handshake request write. 282 // Test for partial handshake request write.
269 { 283 {
270 const int kSplitPoint = 3; // Break handshake write into two parts. 284 const int kSplitPoint = 3; // Break handshake write into two parts.
271 MockWrite data_writes[] = { 285 MockWrite data_writes[] = {
272 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), 286 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)),
273 MockWrite(true, kSOCKS5OkRequest, kSplitPoint), 287 MockWrite(true, kSOCKS5OkRequest, kSplitPoint),
274 MockWrite(true, kSOCKS5OkRequest + kSplitPoint, 288 MockWrite(true, kSOCKS5OkRequest + kSplitPoint,
275 arraysize(kSOCKS5OkRequest) - kSplitPoint) 289 arraysize(kSOCKS5OkRequest) - kSplitPoint)
276 }; 290 };
277 MockRead data_reads[] = { 291 MockRead data_reads[] = {
278 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), 292 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)),
279 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) }; 293 MockRead(true, kSOCKS5OkResponse, arraysize(kSOCKS5OkResponse)) };
280 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 294 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
295 data_writes, arraysize(data_writes),
296 hostname, 80));
281 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 297 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
282 int rv = user_sock_->Connect(&callback_, log); 298 int rv = user_sock_->Connect(&callback_, log);
283 EXPECT_EQ(ERR_IO_PENDING, rv); 299 EXPECT_EQ(ERR_IO_PENDING, rv);
284 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); 300 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT));
285 rv = callback_.WaitForResult(); 301 rv = callback_.WaitForResult();
286 EXPECT_EQ(OK, rv); 302 EXPECT_EQ(OK, rv);
287 EXPECT_TRUE(user_sock_->IsConnected()); 303 EXPECT_TRUE(user_sock_->IsConnected());
288 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); 304 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT));
289 } 305 }
290 306
291 // Test for partial handshake response read 307 // Test for partial handshake response read
292 { 308 {
293 const int kSplitPoint = 6; // Break the handshake read into two parts. 309 const int kSplitPoint = 6; // Break the handshake read into two parts.
294 MockWrite data_writes[] = { 310 MockWrite data_writes[] = {
295 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)), 311 MockWrite(true, kSOCKS5GreetRequest, arraysize(kSOCKS5GreetRequest)),
296 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest)) 312 MockWrite(true, kSOCKS5OkRequest, arraysize(kSOCKS5OkRequest))
297 }; 313 };
298 MockRead data_reads[] = { 314 MockRead data_reads[] = {
299 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)), 315 MockRead(true, kSOCKS5GreetResponse, arraysize(kSOCKS5GreetResponse)),
300 MockRead(true, kSOCKS5OkResponse, kSplitPoint), 316 MockRead(true, kSOCKS5OkResponse, kSplitPoint),
301 MockRead(true, kSOCKS5OkResponse + kSplitPoint, 317 MockRead(true, kSOCKS5OkResponse + kSplitPoint,
302 arraysize(kSOCKS5OkResponse) - kSplitPoint) 318 arraysize(kSOCKS5OkResponse) - kSplitPoint)
303 }; 319 };
304 320
305 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 321 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
322 data_writes, arraysize(data_writes),
323 hostname, 80));
306 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 324 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
307 int rv = user_sock_->Connect(&callback_, log); 325 int rv = user_sock_->Connect(&callback_, log);
308 EXPECT_EQ(ERR_IO_PENDING, rv); 326 EXPECT_EQ(ERR_IO_PENDING, rv);
309 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT)); 327 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS5_CONNECT));
310 rv = callback_.WaitForResult(); 328 rv = callback_.WaitForResult();
311 EXPECT_EQ(OK, rv); 329 EXPECT_EQ(OK, rv);
312 EXPECT_TRUE(user_sock_->IsConnected()); 330 EXPECT_TRUE(user_sock_->IsConnected());
313 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT)); 331 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS5_CONNECT));
314 } 332 }
315 } 333 }
316 334
317 } // namespace 335 } // namespace
318 336
319 } // namespace net 337 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/socket_test_util.cc ('k') | net/socket/socks_client_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698