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

Side by Side Diff: net/ftp/ftp_network_transaction_unittest.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 | Annotate | Revision Log
OLDNEW
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/ftp/ftp_network_transaction.h" 5 #include "net/ftp/ftp_network_transaction.h"
6 6
7 #include "build/build_config.h" 7 #include "build/build_config.h"
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 use_epsv_(true), 61 use_epsv_(true),
62 data_type_('I') { 62 data_type_('I') {
63 Init(); 63 Init();
64 } 64 }
65 65
66 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 66 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
67 if (InjectFault()) 67 if (InjectFault())
68 return MockWriteResult(ASYNC, data.length()); 68 return MockWriteResult(ASYNC, data.length());
69 switch (state()) { 69 switch (state()) {
70 case PRE_USER: 70 case PRE_USER:
71 return Verify("USER anonymous\r\n", data, PRE_PASSWD, 71 return Verify(
72 "331 Password needed\r\n"); 72 "USER anonymous\r\n", data, PRE_PASSWD, "331 Password needed\r\n");
73 case PRE_PASSWD: 73 case PRE_PASSWD: {
74 { 74 const char* response_one = "230 Welcome\r\n";
75 const char* response_one = "230 Welcome\r\n"; 75 const char* response_multi = "230- One\r\n230- Two\r\n230 Three\r\n";
76 const char* response_multi = "230- One\r\n230- Two\r\n230 Three\r\n"; 76 return Verify("PASS chrome@example.com\r\n",
77 return Verify("PASS chrome@example.com\r\n", data, PRE_SYST, 77 data,
78 multiline_welcome_ ? response_multi : response_one); 78 PRE_SYST,
79 } 79 multiline_welcome_ ? response_multi : response_one);
80 }
80 case PRE_SYST: 81 case PRE_SYST:
81 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); 82 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n");
82 case PRE_PWD: 83 case PRE_PWD:
83 return Verify("PWD\r\n", data, PRE_TYPE, 84 return Verify("PWD\r\n",
85 data,
86 PRE_TYPE,
84 "257 \"/\" is your current location\r\n"); 87 "257 \"/\" is your current location\r\n");
85 case PRE_TYPE: 88 case PRE_TYPE:
86 return Verify(std::string("TYPE ") + data_type_ + "\r\n", data, 89 return Verify(std::string("TYPE ") + data_type_ + "\r\n",
90 data,
87 use_epsv_ ? PRE_EPSV : PRE_PASV, 91 use_epsv_ ? PRE_EPSV : PRE_PASV,
88 "200 TYPE set successfully\r\n"); 92 "200 TYPE set successfully\r\n");
89 case PRE_EPSV: 93 case PRE_EPSV:
90 return Verify("EPSV\r\n", data, PRE_SIZE, 94 return Verify("EPSV\r\n",
95 data,
96 PRE_SIZE,
91 "227 Entering Extended Passive Mode (|||31744|)\r\n"); 97 "227 Entering Extended Passive Mode (|||31744|)\r\n");
92 case PRE_CWD_EPSV: 98 case PRE_CWD_EPSV:
93 return Verify("EPSV\r\n", data, PRE_CWD, 99 return Verify("EPSV\r\n",
100 data,
101 PRE_CWD,
94 "227 Entering Extended Passive Mode (|||31744|)\r\n"); 102 "227 Entering Extended Passive Mode (|||31744|)\r\n");
95 case PRE_RETR_EPSV: 103 case PRE_RETR_EPSV:
96 return Verify("EPSV\r\n", data, PRE_RETR, 104 return Verify("EPSV\r\n",
105 data,
106 PRE_RETR,
97 "227 Entering Extended Passive Mode (|||31744|)\r\n"); 107 "227 Entering Extended Passive Mode (|||31744|)\r\n");
98 case PRE_CWD_PASV: 108 case PRE_CWD_PASV:
99 return Verify("PASV\r\n", data, PRE_CWD, 109 return Verify("PASV\r\n",
110 data,
111 PRE_CWD,
100 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); 112 "227 Entering Passive Mode 127,0,0,1,123,456\r\n");
101 case PRE_RETR_PASV: 113 case PRE_RETR_PASV:
102 return Verify("PASV\r\n", data, PRE_RETR, 114 return Verify("PASV\r\n",
115 data,
116 PRE_RETR,
103 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); 117 "227 Entering Passive Mode 127,0,0,1,123,456\r\n");
104 case PRE_PASV: 118 case PRE_PASV:
105 return Verify("PASV\r\n", data, PRE_SIZE, 119 return Verify("PASV\r\n",
120 data,
121 PRE_SIZE,
106 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); 122 "227 Entering Passive Mode 127,0,0,1,123,456\r\n");
107 case PRE_NOPASV: 123 case PRE_NOPASV:
108 // Use unallocated 599 FTP error code to make sure it falls into the 124 // Use unallocated 599 FTP error code to make sure it falls into the
109 // generic ERR_FTP_FAILED bucket. 125 // generic ERR_FTP_FAILED bucket.
110 return Verify("PASV\r\n", data, PRE_QUIT, 126 return Verify("PASV\r\n", data, PRE_QUIT, "599 fail\r\n");
111 "599 fail\r\n");
112 case PRE_QUIT: 127 case PRE_QUIT:
113 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); 128 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n");
114 default: 129 default:
115 NOTREACHED() << "State not handled " << state(); 130 NOTREACHED() << "State not handled " << state();
116 return MockWriteResult(ASYNC, ERR_UNEXPECTED); 131 return MockWriteResult(ASYNC, ERR_UNEXPECTED);
117 } 132 }
118 } 133 }
119 134
120 void InjectFailure(State state, State next_state, const char* response) { 135 void InjectFailure(State state, State next_state, const char* response) {
121 DCHECK_EQ(NONE, failure_injection_state_); 136 DCHECK_EQ(NONE, failure_injection_state_);
122 DCHECK_NE(NONE, state); 137 DCHECK_NE(NONE, state);
123 DCHECK_NE(NONE, next_state); 138 DCHECK_NE(NONE, next_state);
124 DCHECK_NE(state, next_state); 139 DCHECK_NE(state, next_state);
125 failure_injection_state_ = state; 140 failure_injection_state_ = state;
126 failure_injection_next_state_ = next_state; 141 failure_injection_next_state_ = next_state;
127 fault_response_ = response; 142 fault_response_ = response;
128 } 143 }
129 144
130 State state() const { 145 State state() const { return state_; }
131 return state_;
132 }
133 146
134 virtual void Reset() OVERRIDE { 147 virtual void Reset() OVERRIDE {
135 DynamicSocketDataProvider::Reset(); 148 DynamicSocketDataProvider::Reset();
136 Init(); 149 Init();
137 } 150 }
138 151
139 void set_multiline_welcome(bool multiline) { multiline_welcome_ = multiline; } 152 void set_multiline_welcome(bool multiline) { multiline_welcome_ = multiline; }
140 153
141 bool use_epsv() const { return use_epsv_; } 154 bool use_epsv() const { return use_epsv_; }
142 void set_use_epsv(bool use_epsv) { use_epsv_ = use_epsv; } 155 void set_use_epsv(bool use_epsv) { use_epsv_ = use_epsv; }
(...skipping 27 matching lines...) Expand all
170 SimulateRead(next_read, next_read_length); 183 SimulateRead(next_read, next_read_length);
171 return MockWriteResult(ASYNC, data.length()); 184 return MockWriteResult(ASYNC, data.length());
172 } 185 }
173 return MockWriteResult(ASYNC, ERR_UNEXPECTED); 186 return MockWriteResult(ASYNC, ERR_UNEXPECTED);
174 } 187 }
175 188
176 MockWriteResult Verify(const std::string& expected, 189 MockWriteResult Verify(const std::string& expected,
177 const std::string& data, 190 const std::string& data,
178 State next_state, 191 State next_state,
179 const char* next_read) { 192 const char* next_read) {
180 return Verify(expected, data, next_state, 193 return Verify(
181 next_read, std::strlen(next_read)); 194 expected, data, next_state, next_read, std::strlen(next_read));
182 } 195 }
183 196
184
185 private: 197 private:
186 State state_; 198 State state_;
187 State failure_injection_state_; 199 State failure_injection_state_;
188 State failure_injection_next_state_; 200 State failure_injection_next_state_;
189 const char* fault_response_; 201 const char* fault_response_;
190 202
191 // If true, we will send multiple 230 lines as response after PASS. 203 // If true, we will send multiple 230 lines as response after PASS.
192 bool multiline_welcome_; 204 bool multiline_welcome_;
193 205
194 // If true, we will use EPSV command. 206 // If true, we will use EPSV command.
195 bool use_epsv_; 207 bool use_epsv_;
196 208
197 // Data type to be used for TYPE command. 209 // Data type to be used for TYPE command.
198 char data_type_; 210 char data_type_;
199 211
200 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProvider); 212 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProvider);
201 }; 213 };
202 214
203 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { 215 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider {
204 public: 216 public:
205 FtpSocketDataProviderDirectoryListing() { 217 FtpSocketDataProviderDirectoryListing() {}
206 }
207 218
208 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 219 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
209 if (InjectFault()) 220 if (InjectFault())
210 return MockWriteResult(ASYNC, data.length()); 221 return MockWriteResult(ASYNC, data.length());
211 switch (state()) { 222 switch (state()) {
212 case PRE_SIZE: 223 case PRE_SIZE:
213 return Verify("SIZE /\r\n", data, 224 return Verify("SIZE /\r\n",
225 data,
214 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV, 226 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV,
215 "550 I can only retrieve regular files\r\n"); 227 "550 I can only retrieve regular files\r\n");
216 case PRE_CWD: 228 case PRE_CWD:
217 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); 229 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n");
218 case PRE_LIST: 230 case PRE_LIST:
219 return Verify("LIST -l\r\n", data, PRE_QUIT, "200 OK\r\n"); 231 return Verify("LIST -l\r\n", data, PRE_QUIT, "200 OK\r\n");
220 default: 232 default:
221 return FtpSocketDataProvider::OnWrite(data); 233 return FtpSocketDataProvider::OnWrite(data);
222 } 234 }
223 } 235 }
224 236
225 private: 237 private:
226 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing); 238 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing);
227 }; 239 };
228 240
229 class FtpSocketDataProviderDirectoryListingWithPasvFallback 241 class FtpSocketDataProviderDirectoryListingWithPasvFallback
230 : public FtpSocketDataProviderDirectoryListing { 242 : public FtpSocketDataProviderDirectoryListing {
231 public: 243 public:
232 FtpSocketDataProviderDirectoryListingWithPasvFallback() { 244 FtpSocketDataProviderDirectoryListingWithPasvFallback() {}
233 }
234 245
235 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 246 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
236 if (InjectFault()) 247 if (InjectFault())
237 return MockWriteResult(ASYNC, data.length()); 248 return MockWriteResult(ASYNC, data.length());
238 switch (state()) { 249 switch (state()) {
239 case PRE_EPSV: 250 case PRE_EPSV:
240 return Verify("EPSV\r\n", data, PRE_PASV, 251 return Verify("EPSV\r\n", data, PRE_PASV, "500 no EPSV for you\r\n");
241 "500 no EPSV for you\r\n");
242 case PRE_SIZE: 252 case PRE_SIZE:
243 return Verify("SIZE /\r\n", data, PRE_CWD_PASV, 253 return Verify("SIZE /\r\n",
254 data,
255 PRE_CWD_PASV,
244 "550 I can only retrieve regular files\r\n"); 256 "550 I can only retrieve regular files\r\n");
245 default: 257 default:
246 return FtpSocketDataProviderDirectoryListing::OnWrite(data); 258 return FtpSocketDataProviderDirectoryListing::OnWrite(data);
247 } 259 }
248 } 260 }
249 261
250 private: 262 private:
251 DISALLOW_COPY_AND_ASSIGN( 263 DISALLOW_COPY_AND_ASSIGN(
252 FtpSocketDataProviderDirectoryListingWithPasvFallback); 264 FtpSocketDataProviderDirectoryListingWithPasvFallback);
253 }; 265 };
254 266
255 class FtpSocketDataProviderDirectoryListingZeroSize 267 class FtpSocketDataProviderDirectoryListingZeroSize
256 : public FtpSocketDataProviderDirectoryListing { 268 : public FtpSocketDataProviderDirectoryListing {
257 public: 269 public:
258 FtpSocketDataProviderDirectoryListingZeroSize() { 270 FtpSocketDataProviderDirectoryListingZeroSize() {}
259 }
260 271
261 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 272 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
262 if (InjectFault()) 273 if (InjectFault())
263 return MockWriteResult(ASYNC, data.length()); 274 return MockWriteResult(ASYNC, data.length());
264 switch (state()) { 275 switch (state()) {
265 case PRE_SIZE: 276 case PRE_SIZE:
266 return Verify("SIZE /\r\n", data, PRE_CWD, "213 0\r\n"); 277 return Verify("SIZE /\r\n", data, PRE_CWD, "213 0\r\n");
267 default: 278 default:
268 return FtpSocketDataProviderDirectoryListing::OnWrite(data); 279 return FtpSocketDataProviderDirectoryListing::OnWrite(data);
269 } 280 }
270 } 281 }
271 282
272 private: 283 private:
273 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListingZeroSize); 284 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListingZeroSize);
274 }; 285 };
275 286
276 class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { 287 class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider {
277 public: 288 public:
278 FtpSocketDataProviderVMSDirectoryListing() { 289 FtpSocketDataProviderVMSDirectoryListing() {}
279 }
280 290
281 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 291 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
282 if (InjectFault()) 292 if (InjectFault())
283 return MockWriteResult(ASYNC, data.length()); 293 return MockWriteResult(ASYNC, data.length());
284 switch (state()) { 294 switch (state()) {
285 case PRE_SYST: 295 case PRE_SYST:
286 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); 296 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n");
287 case PRE_PWD: 297 case PRE_PWD:
288 return Verify("PWD\r\n", data, PRE_TYPE, 298 return Verify(
289 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); 299 "PWD\r\n", data, PRE_TYPE, "257 \"ANONYMOUS_ROOT:[000000]\"\r\n");
290 case PRE_EPSV: 300 case PRE_EPSV:
291 return Verify("EPSV\r\n", data, PRE_PASV, "500 Invalid command\r\n"); 301 return Verify("EPSV\r\n", data, PRE_PASV, "500 Invalid command\r\n");
292 case PRE_SIZE: 302 case PRE_SIZE:
293 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD_PASV, 303 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n",
304 data,
305 PRE_CWD_PASV,
294 "550 I can only retrieve regular files\r\n"); 306 "550 I can only retrieve regular files\r\n");
295 case PRE_CWD: 307 case PRE_CWD:
296 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, 308 return Verify(
297 "200 OK\r\n"); 309 "CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, "200 OK\r\n");
298 case PRE_LIST: 310 case PRE_LIST:
299 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); 311 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n");
300 default: 312 default:
301 return FtpSocketDataProvider::OnWrite(data); 313 return FtpSocketDataProvider::OnWrite(data);
302 } 314 }
303 } 315 }
304 316
305 private: 317 private:
306 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing); 318 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing);
307 }; 319 };
308 320
309 class FtpSocketDataProviderVMSDirectoryListingRootDirectory 321 class FtpSocketDataProviderVMSDirectoryListingRootDirectory
310 : public FtpSocketDataProvider { 322 : public FtpSocketDataProvider {
311 public: 323 public:
312 FtpSocketDataProviderVMSDirectoryListingRootDirectory() { 324 FtpSocketDataProviderVMSDirectoryListingRootDirectory() {}
313 }
314 325
315 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 326 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
316 if (InjectFault()) 327 if (InjectFault())
317 return MockWriteResult(ASYNC, data.length()); 328 return MockWriteResult(ASYNC, data.length());
318 switch (state()) { 329 switch (state()) {
319 case PRE_SYST: 330 case PRE_SYST:
320 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); 331 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n");
321 case PRE_PWD: 332 case PRE_PWD:
322 return Verify("PWD\r\n", data, PRE_TYPE, 333 return Verify(
323 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); 334 "PWD\r\n", data, PRE_TYPE, "257 \"ANONYMOUS_ROOT:[000000]\"\r\n");
324 case PRE_EPSV: 335 case PRE_EPSV:
325 return Verify("EPSV\r\n", data, PRE_PASV, 336 return Verify(
326 "500 EPSV command unknown\r\n"); 337 "EPSV\r\n", data, PRE_PASV, "500 EPSV command unknown\r\n");
327 case PRE_SIZE: 338 case PRE_SIZE:
328 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD_PASV, 339 return Verify("SIZE ANONYMOUS_ROOT\r\n",
340 data,
341 PRE_CWD_PASV,
329 "550 I can only retrieve regular files\r\n"); 342 "550 I can only retrieve regular files\r\n");
330 case PRE_CWD: 343 case PRE_CWD:
331 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, 344 return Verify(
332 "200 OK\r\n"); 345 "CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, "200 OK\r\n");
333 case PRE_LIST: 346 case PRE_LIST:
334 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); 347 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n");
335 default: 348 default:
336 return FtpSocketDataProvider::OnWrite(data); 349 return FtpSocketDataProvider::OnWrite(data);
337 } 350 }
338 } 351 }
339 352
340 private: 353 private:
341 DISALLOW_COPY_AND_ASSIGN( 354 DISALLOW_COPY_AND_ASSIGN(
342 FtpSocketDataProviderVMSDirectoryListingRootDirectory); 355 FtpSocketDataProviderVMSDirectoryListingRootDirectory);
343 }; 356 };
344 357
345 class FtpSocketDataProviderFileDownloadWithFileTypecode 358 class FtpSocketDataProviderFileDownloadWithFileTypecode
346 : public FtpSocketDataProvider { 359 : public FtpSocketDataProvider {
347 public: 360 public:
348 FtpSocketDataProviderFileDownloadWithFileTypecode() { 361 FtpSocketDataProviderFileDownloadWithFileTypecode() {}
349 }
350 362
351 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 363 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
352 if (InjectFault()) 364 if (InjectFault())
353 return MockWriteResult(ASYNC, data.length()); 365 return MockWriteResult(ASYNC, data.length());
354 switch (state()) { 366 switch (state()) {
355 case PRE_SIZE: 367 case PRE_SIZE:
356 return Verify("SIZE /file\r\n", data, PRE_RETR, 368 return Verify("SIZE /file\r\n", data, PRE_RETR, "213 18\r\n");
357 "213 18\r\n");
358 case PRE_RETR: 369 case PRE_RETR:
359 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); 370 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n");
360 default: 371 default:
361 return FtpSocketDataProvider::OnWrite(data); 372 return FtpSocketDataProvider::OnWrite(data);
362 } 373 }
363 } 374 }
364 375
365 private: 376 private:
366 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithFileTypecode); 377 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithFileTypecode);
367 }; 378 };
368 379
369 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { 380 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider {
370 public: 381 public:
371 FtpSocketDataProviderFileDownload() { 382 FtpSocketDataProviderFileDownload() {}
372 }
373 383
374 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 384 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
375 if (InjectFault()) 385 if (InjectFault())
376 return MockWriteResult(ASYNC, data.length()); 386 return MockWriteResult(ASYNC, data.length());
377 switch (state()) { 387 switch (state()) {
378 case PRE_SIZE: 388 case PRE_SIZE:
379 return Verify("SIZE /file\r\n", data, PRE_CWD, 389 return Verify("SIZE /file\r\n", data, PRE_CWD, "213 18\r\n");
380 "213 18\r\n");
381 case PRE_CWD: 390 case PRE_CWD:
382 return Verify("CWD /file\r\n", data, 391 return Verify("CWD /file\r\n",
392 data,
383 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, 393 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV,
384 "550 Not a directory\r\n"); 394 "550 Not a directory\r\n");
385 case PRE_RETR: 395 case PRE_RETR:
386 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); 396 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n");
387 default: 397 default:
388 return FtpSocketDataProvider::OnWrite(data); 398 return FtpSocketDataProvider::OnWrite(data);
389 } 399 }
390 } 400 }
391 401
392 private: 402 private:
393 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); 403 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload);
394 }; 404 };
395 405
396 class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider { 406 class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider {
397 public: 407 public:
398 FtpSocketDataProviderFileNotFound() { 408 FtpSocketDataProviderFileNotFound() {}
399 }
400 409
401 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 410 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
402 if (InjectFault()) 411 if (InjectFault())
403 return MockWriteResult(ASYNC, data.length()); 412 return MockWriteResult(ASYNC, data.length());
404 switch (state()) { 413 switch (state()) {
405 case PRE_SIZE: 414 case PRE_SIZE:
406 return Verify("SIZE /file\r\n", data, 415 return Verify("SIZE /file\r\n",
416 data,
407 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV, 417 use_epsv() ? PRE_CWD_EPSV : PRE_CWD_PASV,
408 "550 File Not Found\r\n"); 418 "550 File Not Found\r\n");
409 case PRE_CWD: 419 case PRE_CWD:
410 return Verify("CWD /file\r\n", data, 420 return Verify("CWD /file\r\n",
421 data,
411 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, 422 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV,
412 "550 File Not Found\r\n"); 423 "550 File Not Found\r\n");
413 case PRE_RETR: 424 case PRE_RETR:
414 return Verify("RETR /file\r\n", data, PRE_QUIT, 425 return Verify(
415 "550 File Not Found\r\n"); 426 "RETR /file\r\n", data, PRE_QUIT, "550 File Not Found\r\n");
416 default: 427 default:
417 return FtpSocketDataProvider::OnWrite(data); 428 return FtpSocketDataProvider::OnWrite(data);
418 } 429 }
419 } 430 }
420 431
421 private: 432 private:
422 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileNotFound); 433 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileNotFound);
423 }; 434 };
424 435
425 class FtpSocketDataProviderFileDownloadWithPasvFallback 436 class FtpSocketDataProviderFileDownloadWithPasvFallback
426 : public FtpSocketDataProviderFileDownload { 437 : public FtpSocketDataProviderFileDownload {
427 public: 438 public:
428 FtpSocketDataProviderFileDownloadWithPasvFallback() { 439 FtpSocketDataProviderFileDownloadWithPasvFallback() {}
429 }
430 440
431 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 441 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
432 if (InjectFault()) 442 if (InjectFault())
433 return MockWriteResult(ASYNC, data.length()); 443 return MockWriteResult(ASYNC, data.length());
434 switch (state()) { 444 switch (state()) {
435 case PRE_EPSV: 445 case PRE_EPSV:
436 return Verify("EPSV\r\n", data, PRE_PASV, 446 return Verify("EPSV\r\n", data, PRE_PASV, "500 No can do\r\n");
437 "500 No can do\r\n");
438 case PRE_CWD: 447 case PRE_CWD:
439 return Verify("CWD /file\r\n", data, PRE_RETR_PASV, 448 return Verify(
440 "550 Not a directory\r\n"); 449 "CWD /file\r\n", data, PRE_RETR_PASV, "550 Not a directory\r\n");
441 default: 450 default:
442 return FtpSocketDataProviderFileDownload::OnWrite(data); 451 return FtpSocketDataProviderFileDownload::OnWrite(data);
443 } 452 }
444 } 453 }
445 454
446 private: 455 private:
447 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); 456 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback);
448 }; 457 };
449 458
450 class FtpSocketDataProviderFileDownloadZeroSize 459 class FtpSocketDataProviderFileDownloadZeroSize
451 : public FtpSocketDataProviderFileDownload { 460 : public FtpSocketDataProviderFileDownload {
452 public: 461 public:
453 FtpSocketDataProviderFileDownloadZeroSize() { 462 FtpSocketDataProviderFileDownloadZeroSize() {}
454 }
455 463
456 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 464 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
457 if (InjectFault()) 465 if (InjectFault())
458 return MockWriteResult(ASYNC, data.length()); 466 return MockWriteResult(ASYNC, data.length());
459 switch (state()) { 467 switch (state()) {
460 case PRE_SIZE: 468 case PRE_SIZE:
461 return Verify("SIZE /file\r\n", data, PRE_CWD, 469 return Verify("SIZE /file\r\n", data, PRE_CWD, "213 0\r\n");
462 "213 0\r\n");
463 case PRE_CWD: 470 case PRE_CWD:
464 return Verify("CWD /file\r\n", data, 471 return Verify("CWD /file\r\n",
472 data,
465 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, 473 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV,
466 "550 not a directory\r\n"); 474 "550 not a directory\r\n");
467 default: 475 default:
468 return FtpSocketDataProviderFileDownload::OnWrite(data); 476 return FtpSocketDataProviderFileDownload::OnWrite(data);
469 } 477 }
470 } 478 }
471 479
472 private: 480 private:
473 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadZeroSize); 481 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadZeroSize);
474 }; 482 };
475 483
476 class FtpSocketDataProviderFileDownloadCWD451 484 class FtpSocketDataProviderFileDownloadCWD451
477 : public FtpSocketDataProviderFileDownload { 485 : public FtpSocketDataProviderFileDownload {
478 public: 486 public:
479 FtpSocketDataProviderFileDownloadCWD451() { 487 FtpSocketDataProviderFileDownloadCWD451() {}
480 }
481 488
482 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 489 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
483 if (InjectFault()) 490 if (InjectFault())
484 return MockWriteResult(ASYNC, data.length()); 491 return MockWriteResult(ASYNC, data.length());
485 switch (state()) { 492 switch (state()) {
486 case PRE_CWD: 493 case PRE_CWD:
487 return Verify("CWD /file\r\n", data, 494 return Verify("CWD /file\r\n",
495 data,
488 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, 496 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV,
489 "451 not a directory\r\n"); 497 "451 not a directory\r\n");
490 default: 498 default:
491 return FtpSocketDataProviderFileDownload::OnWrite(data); 499 return FtpSocketDataProviderFileDownload::OnWrite(data);
492 } 500 }
493 } 501 }
494 502
495 private: 503 private:
496 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadCWD451); 504 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadCWD451);
497 }; 505 };
498 506
499 class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { 507 class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider {
500 public: 508 public:
501 FtpSocketDataProviderVMSFileDownload() { 509 FtpSocketDataProviderVMSFileDownload() {}
502 }
503 510
504 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 511 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
505 if (InjectFault()) 512 if (InjectFault())
506 return MockWriteResult(ASYNC, data.length()); 513 return MockWriteResult(ASYNC, data.length());
507 switch (state()) { 514 switch (state()) {
508 case PRE_SYST: 515 case PRE_SYST:
509 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); 516 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n");
510 case PRE_PWD: 517 case PRE_PWD:
511 return Verify("PWD\r\n", data, PRE_TYPE, 518 return Verify(
512 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); 519 "PWD\r\n", data, PRE_TYPE, "257 \"ANONYMOUS_ROOT:[000000]\"\r\n");
513 case PRE_EPSV: 520 case PRE_EPSV:
514 return Verify("EPSV\r\n", data, PRE_PASV, 521 return Verify(
515 "500 EPSV command unknown\r\n"); 522 "EPSV\r\n", data, PRE_PASV, "500 EPSV command unknown\r\n");
516 case PRE_SIZE: 523 case PRE_SIZE:
517 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_CWD, 524 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n",
525 data,
526 PRE_CWD,
518 "213 18\r\n"); 527 "213 18\r\n");
519 case PRE_CWD: 528 case PRE_CWD:
520 return Verify("CWD ANONYMOUS_ROOT:[file]\r\n", data, PRE_RETR_PASV, 529 return Verify("CWD ANONYMOUS_ROOT:[file]\r\n",
530 data,
531 PRE_RETR_PASV,
521 "550 Not a directory\r\n"); 532 "550 Not a directory\r\n");
522 case PRE_RETR: 533 case PRE_RETR:
523 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, 534 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n",
535 data,
536 PRE_QUIT,
524 "200 OK\r\n"); 537 "200 OK\r\n");
525 default: 538 default:
526 return FtpSocketDataProvider::OnWrite(data); 539 return FtpSocketDataProvider::OnWrite(data);
527 } 540 }
528 } 541 }
529 542
530 private: 543 private:
531 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload); 544 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload);
532 }; 545 };
533 546
534 class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload { 547 class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload {
535 public: 548 public:
536 FtpSocketDataProviderEscaping() { 549 FtpSocketDataProviderEscaping() {}
537 }
538 550
539 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 551 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
540 if (InjectFault()) 552 if (InjectFault())
541 return MockWriteResult(ASYNC, data.length()); 553 return MockWriteResult(ASYNC, data.length());
542 switch (state()) { 554 switch (state()) {
543 case PRE_SIZE: 555 case PRE_SIZE:
544 return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_CWD, 556 return Verify(
545 "213 18\r\n"); 557 "SIZE / !\"#$%y\200\201\r\n", data, PRE_CWD, "213 18\r\n");
546 case PRE_CWD: 558 case PRE_CWD:
547 return Verify("CWD / !\"#$%y\200\201\r\n", data, 559 return Verify("CWD / !\"#$%y\200\201\r\n",
560 data,
548 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, 561 use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV,
549 "550 Not a directory\r\n"); 562 "550 Not a directory\r\n");
550 case PRE_RETR: 563 case PRE_RETR:
551 return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, 564 return Verify(
552 "200 OK\r\n"); 565 "RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, "200 OK\r\n");
553 default: 566 default:
554 return FtpSocketDataProviderFileDownload::OnWrite(data); 567 return FtpSocketDataProviderFileDownload::OnWrite(data);
555 } 568 }
556 } 569 }
557 570
558 private: 571 private:
559 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping); 572 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping);
560 }; 573 };
561 574
562 class FtpSocketDataProviderFileDownloadTransferStarting 575 class FtpSocketDataProviderFileDownloadTransferStarting
563 : public FtpSocketDataProviderFileDownload { 576 : public FtpSocketDataProviderFileDownload {
564 public: 577 public:
565 FtpSocketDataProviderFileDownloadTransferStarting() { 578 FtpSocketDataProviderFileDownloadTransferStarting() {}
566 }
567 579
568 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 580 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
569 if (InjectFault()) 581 if (InjectFault())
570 return MockWriteResult(ASYNC, data.length()); 582 return MockWriteResult(ASYNC, data.length());
571 switch (state()) { 583 switch (state()) {
572 case PRE_RETR: 584 case PRE_RETR:
573 return Verify("RETR /file\r\n", data, PRE_QUIT, 585 return Verify("RETR /file\r\n",
586 data,
587 PRE_QUIT,
574 "125-Data connection already open.\r\n" 588 "125-Data connection already open.\r\n"
575 "125 Transfer starting.\r\n" 589 "125 Transfer starting.\r\n"
576 "226 Transfer complete.\r\n"); 590 "226 Transfer complete.\r\n");
577 default: 591 default:
578 return FtpSocketDataProviderFileDownload::OnWrite(data); 592 return FtpSocketDataProviderFileDownload::OnWrite(data);
579 } 593 }
580 } 594 }
581 595
582 private: 596 private:
583 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadTransferStarting); 597 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadTransferStarting);
584 }; 598 };
585 599
586 class FtpSocketDataProviderDirectoryListingTransferStarting 600 class FtpSocketDataProviderDirectoryListingTransferStarting
587 : public FtpSocketDataProviderDirectoryListing { 601 : public FtpSocketDataProviderDirectoryListing {
588 public: 602 public:
589 FtpSocketDataProviderDirectoryListingTransferStarting() { 603 FtpSocketDataProviderDirectoryListingTransferStarting() {}
590 }
591 604
592 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 605 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
593 if (InjectFault()) 606 if (InjectFault())
594 return MockWriteResult(ASYNC, data.length()); 607 return MockWriteResult(ASYNC, data.length());
595 switch (state()) { 608 switch (state()) {
596 case PRE_LIST: 609 case PRE_LIST:
597 return Verify("LIST -l\r\n", data, PRE_QUIT, 610 return Verify("LIST -l\r\n",
611 data,
612 PRE_QUIT,
598 "125-Data connection already open.\r\n" 613 "125-Data connection already open.\r\n"
599 "125 Transfer starting.\r\n" 614 "125 Transfer starting.\r\n"
600 "226 Transfer complete.\r\n"); 615 "226 Transfer complete.\r\n");
601 default: 616 default:
602 return FtpSocketDataProviderDirectoryListing::OnWrite(data); 617 return FtpSocketDataProviderDirectoryListing::OnWrite(data);
603 } 618 }
604 } 619 }
605 620
606 private: 621 private:
607 DISALLOW_COPY_AND_ASSIGN( 622 DISALLOW_COPY_AND_ASSIGN(
608 FtpSocketDataProviderDirectoryListingTransferStarting); 623 FtpSocketDataProviderDirectoryListingTransferStarting);
609 }; 624 };
610 625
611 class FtpSocketDataProviderFileDownloadInvalidResponse 626 class FtpSocketDataProviderFileDownloadInvalidResponse
612 : public FtpSocketDataProviderFileDownload { 627 : public FtpSocketDataProviderFileDownload {
613 public: 628 public:
614 FtpSocketDataProviderFileDownloadInvalidResponse() { 629 FtpSocketDataProviderFileDownloadInvalidResponse() {}
615 }
616 630
617 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 631 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
618 if (InjectFault()) 632 if (InjectFault())
619 return MockWriteResult(ASYNC, data.length()); 633 return MockWriteResult(ASYNC, data.length());
620 switch (state()) { 634 switch (state()) {
621 case PRE_SIZE: 635 case PRE_SIZE:
622 // Use unallocated 599 FTP error code to make sure it falls into the 636 // Use unallocated 599 FTP error code to make sure it falls into the
623 // generic ERR_FTP_FAILED bucket. 637 // generic ERR_FTP_FAILED bucket.
624 return Verify("SIZE /file\r\n", data, PRE_QUIT, 638 return Verify("SIZE /file\r\n",
639 data,
640 PRE_QUIT,
625 "599 Evil Response\r\n" 641 "599 Evil Response\r\n"
626 "599 More Evil\r\n"); 642 "599 More Evil\r\n");
627 default: 643 default:
628 return FtpSocketDataProviderFileDownload::OnWrite(data); 644 return FtpSocketDataProviderFileDownload::OnWrite(data);
629 } 645 }
630 } 646 }
631 647
632 private: 648 private:
633 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse); 649 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse);
634 }; 650 };
635 651
636 class FtpSocketDataProviderEvilEpsv : public FtpSocketDataProviderFileDownload { 652 class FtpSocketDataProviderEvilEpsv : public FtpSocketDataProviderFileDownload {
637 public: 653 public:
638 FtpSocketDataProviderEvilEpsv(const char* epsv_response, 654 FtpSocketDataProviderEvilEpsv(const char* epsv_response, State expected_state)
639 State expected_state)
640 : epsv_response_(epsv_response), 655 : epsv_response_(epsv_response),
641 epsv_response_length_(std::strlen(epsv_response)), 656 epsv_response_length_(std::strlen(epsv_response)),
642 expected_state_(expected_state) {} 657 expected_state_(expected_state) {}
643 658
644 FtpSocketDataProviderEvilEpsv(const char* epsv_response, 659 FtpSocketDataProviderEvilEpsv(const char* epsv_response,
645 size_t epsv_response_length, 660 size_t epsv_response_length,
646 State expected_state) 661 State expected_state)
647 : epsv_response_(epsv_response), 662 : epsv_response_(epsv_response),
648 epsv_response_length_(epsv_response_length), 663 epsv_response_length_(epsv_response_length),
649 expected_state_(expected_state) {} 664 expected_state_(expected_state) {}
650 665
651 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 666 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
652 if (InjectFault()) 667 if (InjectFault())
653 return MockWriteResult(ASYNC, data.length()); 668 return MockWriteResult(ASYNC, data.length());
654 switch (state()) { 669 switch (state()) {
655 case PRE_EPSV: 670 case PRE_EPSV:
656 return Verify("EPSV\r\n", data, expected_state_, 671 return Verify("EPSV\r\n",
657 epsv_response_, epsv_response_length_); 672 data,
673 expected_state_,
674 epsv_response_,
675 epsv_response_length_);
658 default: 676 default:
659 return FtpSocketDataProviderFileDownload::OnWrite(data); 677 return FtpSocketDataProviderFileDownload::OnWrite(data);
660 } 678 }
661 } 679 }
662 680
663 private: 681 private:
664 const char* epsv_response_; 682 const char* epsv_response_;
665 const size_t epsv_response_length_; 683 const size_t epsv_response_length_;
666 const State expected_state_; 684 const State expected_state_;
667 685
668 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilEpsv); 686 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilEpsv);
669 }; 687 };
670 688
671 class FtpSocketDataProviderEvilPasv 689 class FtpSocketDataProviderEvilPasv
672 : public FtpSocketDataProviderFileDownloadWithPasvFallback { 690 : public FtpSocketDataProviderFileDownloadWithPasvFallback {
673 public: 691 public:
674 FtpSocketDataProviderEvilPasv(const char* pasv_response, State expected_state) 692 FtpSocketDataProviderEvilPasv(const char* pasv_response, State expected_state)
675 : pasv_response_(pasv_response), 693 : pasv_response_(pasv_response), expected_state_(expected_state) {}
676 expected_state_(expected_state) {
677 }
678 694
679 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 695 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
680 if (InjectFault()) 696 if (InjectFault())
681 return MockWriteResult(ASYNC, data.length()); 697 return MockWriteResult(ASYNC, data.length());
682 switch (state()) { 698 switch (state()) {
683 case PRE_PASV: 699 case PRE_PASV:
684 return Verify("PASV\r\n", data, expected_state_, pasv_response_); 700 return Verify("PASV\r\n", data, expected_state_, pasv_response_);
685 default: 701 default:
686 return FtpSocketDataProviderFileDownloadWithPasvFallback::OnWrite(data); 702 return FtpSocketDataProviderFileDownloadWithPasvFallback::OnWrite(data);
687 } 703 }
688 } 704 }
689 705
690 private: 706 private:
691 const char* pasv_response_; 707 const char* pasv_response_;
692 const State expected_state_; 708 const State expected_state_;
693 709
694 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilPasv); 710 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilPasv);
695 }; 711 };
696 712
697 class FtpSocketDataProviderEvilSize : public FtpSocketDataProviderFileDownload { 713 class FtpSocketDataProviderEvilSize : public FtpSocketDataProviderFileDownload {
698 public: 714 public:
699 FtpSocketDataProviderEvilSize(const char* size_response, State expected_state) 715 FtpSocketDataProviderEvilSize(const char* size_response, State expected_state)
700 : size_response_(size_response), 716 : size_response_(size_response), expected_state_(expected_state) {}
701 expected_state_(expected_state) {
702 }
703 717
704 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 718 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
705 if (InjectFault()) 719 if (InjectFault())
706 return MockWriteResult(ASYNC, data.length()); 720 return MockWriteResult(ASYNC, data.length());
707 switch (state()) { 721 switch (state()) {
708 case PRE_SIZE: 722 case PRE_SIZE:
709 return Verify("SIZE /file\r\n", data, expected_state_, size_response_); 723 return Verify("SIZE /file\r\n", data, expected_state_, size_response_);
710 default: 724 default:
711 return FtpSocketDataProviderFileDownload::OnWrite(data); 725 return FtpSocketDataProviderFileDownload::OnWrite(data);
712 } 726 }
713 } 727 }
714 728
715 private: 729 private:
716 const char* size_response_; 730 const char* size_response_;
717 const State expected_state_; 731 const State expected_state_;
718 732
719 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilSize); 733 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilSize);
720 }; 734 };
721 735
722 class FtpSocketDataProviderEvilLogin 736 class FtpSocketDataProviderEvilLogin
723 : public FtpSocketDataProviderFileDownload { 737 : public FtpSocketDataProviderFileDownload {
724 public: 738 public:
725 FtpSocketDataProviderEvilLogin(const char* expected_user, 739 FtpSocketDataProviderEvilLogin(const char* expected_user,
726 const char* expected_password) 740 const char* expected_password)
727 : expected_user_(expected_user), 741 : expected_user_(expected_user), expected_password_(expected_password) {}
728 expected_password_(expected_password) {
729 }
730 742
731 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 743 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
732 if (InjectFault()) 744 if (InjectFault())
733 return MockWriteResult(ASYNC, data.length()); 745 return MockWriteResult(ASYNC, data.length());
734 switch (state()) { 746 switch (state()) {
735 case PRE_USER: 747 case PRE_USER:
736 return Verify(std::string("USER ") + expected_user_ + "\r\n", data, 748 return Verify(std::string("USER ") + expected_user_ + "\r\n",
737 PRE_PASSWD, "331 Password needed\r\n"); 749 data,
750 PRE_PASSWD,
751 "331 Password needed\r\n");
738 case PRE_PASSWD: 752 case PRE_PASSWD:
739 return Verify(std::string("PASS ") + expected_password_ + "\r\n", data, 753 return Verify(std::string("PASS ") + expected_password_ + "\r\n",
740 PRE_SYST, "230 Welcome\r\n"); 754 data,
755 PRE_SYST,
756 "230 Welcome\r\n");
741 default: 757 default:
742 return FtpSocketDataProviderFileDownload::OnWrite(data); 758 return FtpSocketDataProviderFileDownload::OnWrite(data);
743 } 759 }
744 } 760 }
745 761
746 private: 762 private:
747 const char* expected_user_; 763 const char* expected_user_;
748 const char* expected_password_; 764 const char* expected_password_;
749 765
750 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilLogin); 766 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilLogin);
751 }; 767 };
752 768
753 class FtpSocketDataProviderCloseConnection : public FtpSocketDataProvider { 769 class FtpSocketDataProviderCloseConnection : public FtpSocketDataProvider {
754 public: 770 public:
755 FtpSocketDataProviderCloseConnection() { 771 FtpSocketDataProviderCloseConnection() {}
756 }
757 772
758 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE { 773 virtual MockWriteResult OnWrite(const std::string& data) OVERRIDE {
759 if (InjectFault()) 774 if (InjectFault())
760 return MockWriteResult(ASYNC, data.length()); 775 return MockWriteResult(ASYNC, data.length());
761 switch (state()) { 776 switch (state()) {
762 case PRE_USER: 777 case PRE_USER:
763 return Verify("USER anonymous\r\n", data, 778 return Verify("USER anonymous\r\n", data, PRE_QUIT, "");
764 PRE_QUIT, "");
765 default: 779 default:
766 return FtpSocketDataProvider::OnWrite(data); 780 return FtpSocketDataProvider::OnWrite(data);
767 } 781 }
768 } 782 }
769 783
770 private: 784 private:
771 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderCloseConnection); 785 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderCloseConnection);
772 }; 786 };
773 787
774 class FtpNetworkTransactionTest 788 class FtpNetworkTransactionTest : public PlatformTest,
775 : public PlatformTest, 789 public ::testing::WithParamInterface<int> {
776 public ::testing::WithParamInterface<int> {
777 public: 790 public:
778 FtpNetworkTransactionTest() 791 FtpNetworkTransactionTest()
779 : host_resolver_(new MockHostResolver), 792 : host_resolver_(new MockHostResolver),
780 session_(new FtpNetworkSession(host_resolver_.get())), 793 session_(new FtpNetworkSession(host_resolver_.get())),
781 transaction_(session_.get(), &mock_socket_factory_) { 794 transaction_(session_.get(), &mock_socket_factory_) {
782 scoped_refptr<RuleBasedHostResolverProc> rules( 795 scoped_refptr<RuleBasedHostResolverProc> rules(
783 new RuleBasedHostResolverProc(NULL)); 796 new RuleBasedHostResolverProc(NULL));
784 if (GetFamily() == AF_INET) { 797 if (GetFamily() == AF_INET) {
785 rules->AddIPLiteralRule("*", "127.0.0.1", "127.0.0.1"); 798 rules->AddIPLiteralRule("*", "127.0.0.1", "127.0.0.1");
786 } else if (GetFamily() == AF_INET6) { 799 } else if (GetFamily() == AF_INET6) {
787 rules->AddIPLiteralRule("*", "::1", "::1"); 800 rules->AddIPLiteralRule("*", "::1", "::1");
788 } else { 801 } else {
789 NOTREACHED(); 802 NOTREACHED();
790 } 803 }
791 host_resolver_->set_rules(rules.get()); 804 host_resolver_->set_rules(rules.get());
792 } 805 }
793 806
794 protected: 807 protected:
795 // Accessor to make code refactoring-friendly, e.g. when we change the way 808 // Accessor to make code refactoring-friendly, e.g. when we change the way
796 // parameters are passed (like more parameters). 809 // parameters are passed (like more parameters).
797 int GetFamily() { 810 int GetFamily() { return GetParam(); }
798 return GetParam();
799 }
800 811
801 FtpRequestInfo GetRequestInfo(const std::string& url) { 812 FtpRequestInfo GetRequestInfo(const std::string& url) {
802 FtpRequestInfo info; 813 FtpRequestInfo info;
803 info.url = GURL(url); 814 info.url = GURL(url);
804 return info; 815 return info;
805 } 816 }
806 817
807 void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket, 818 void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket,
808 const char* request, 819 const char* request,
809 int data_socket, 820 int data_socket,
810 int expected_result) { 821 int expected_result) {
811 // Expect EPSV usage for non-IPv4 control connections. 822 // Expect EPSV usage for non-IPv4 control connections.
812 ctrl_socket->set_use_epsv((GetFamily() != AF_INET)); 823 ctrl_socket->set_use_epsv((GetFamily() != AF_INET));
813 824
814 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); 825 mock_socket_factory_.AddSocketDataProvider(ctrl_socket);
815 826
816 std::string mock_data("mock-data"); 827 std::string mock_data("mock-data");
817 MockRead data_reads[] = { 828 MockRead data_reads[] = {
818 // Usually FTP servers close the data connection after the entire data has 829 // Usually FTP servers close the data connection after the entire data
819 // been received. 830 // has
820 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), 831 // been received.
821 MockRead(mock_data.c_str()), 832 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ),
833 MockRead(mock_data.c_str()),
822 }; 834 };
823 835
824 ScopedVector<StaticSocketDataProvider> data_sockets; 836 ScopedVector<StaticSocketDataProvider> data_sockets;
825 data_sockets.reserve(data_socket); 837 data_sockets.reserve(data_socket);
826 for (int i = 0; i < data_socket + 1; i++) { 838 for (int i = 0; i < data_socket + 1; i++) {
827 // We only read from one data socket, other ones are dummy. 839 // We only read from one data socket, other ones are dummy.
828 if (i == data_socket) { 840 if (i == data_socket) {
829 data_sockets.push_back(new StaticSocketDataProvider( 841 data_sockets.push_back(new StaticSocketDataProvider(
830 data_reads, arraysize(data_reads), NULL, 0)); 842 data_reads, arraysize(data_reads), NULL, 0));
831 } else { 843 } else {
832 data_sockets.push_back(new StaticSocketDataProvider); 844 data_sockets.push_back(new StaticSocketDataProvider);
833 } 845 }
834 mock_socket_factory_.AddSocketDataProvider(data_sockets[i]); 846 mock_socket_factory_.AddSocketDataProvider(data_sockets[i]);
835 } 847 }
836 848
837 FtpRequestInfo request_info = GetRequestInfo(request); 849 FtpRequestInfo request_info = GetRequestInfo(request);
838 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 850 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
839 ASSERT_EQ(ERR_IO_PENDING, 851 ASSERT_EQ(
840 transaction_.Start(&request_info, callback_.callback(), 852 ERR_IO_PENDING,
841 BoundNetLog())); 853 transaction_.Start(&request_info, callback_.callback(), BoundNetLog()));
842 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); 854 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState());
843 ASSERT_EQ(expected_result, callback_.WaitForResult()); 855 ASSERT_EQ(expected_result, callback_.WaitForResult());
844 if (expected_result == OK) { 856 if (expected_result == OK) {
845 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); 857 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize));
846 memset(io_buffer->data(), 0, kBufferSize); 858 memset(io_buffer->data(), 0, kBufferSize);
847 ASSERT_EQ(ERR_IO_PENDING, 859 ASSERT_EQ(ERR_IO_PENDING,
848 transaction_.Read(io_buffer.get(), kBufferSize, 860 transaction_.Read(
849 callback_.callback())); 861 io_buffer.get(), kBufferSize, callback_.callback()));
850 ASSERT_EQ(static_cast<int>(mock_data.length()), 862 ASSERT_EQ(static_cast<int>(mock_data.length()),
851 callback_.WaitForResult()); 863 callback_.WaitForResult());
852 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); 864 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length()));
853 865
854 // Do another Read to detect that the data socket is now closed. 866 // Do another Read to detect that the data socket is now closed.
855 int rv = transaction_.Read(io_buffer.get(), kBufferSize, 867 int rv =
856 callback_.callback()); 868 transaction_.Read(io_buffer.get(), kBufferSize, callback_.callback());
857 if (rv == ERR_IO_PENDING) { 869 if (rv == ERR_IO_PENDING) {
858 EXPECT_EQ(0, callback_.WaitForResult()); 870 EXPECT_EQ(0, callback_.WaitForResult());
859 } else { 871 } else {
860 EXPECT_EQ(0, rv); 872 EXPECT_EQ(0, rv);
861 } 873 }
862 } 874 }
863 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); 875 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state());
864 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 876 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
865 } 877 }
866 878
(...skipping 15 matching lines...) Expand all
882 }; 894 };
883 895
884 TEST_P(FtpNetworkTransactionTest, FailedLookup) { 896 TEST_P(FtpNetworkTransactionTest, FailedLookup) {
885 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); 897 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost");
886 scoped_refptr<RuleBasedHostResolverProc> rules( 898 scoped_refptr<RuleBasedHostResolverProc> rules(
887 new RuleBasedHostResolverProc(NULL)); 899 new RuleBasedHostResolverProc(NULL));
888 rules->AddSimulatedFailure("badhost"); 900 rules->AddSimulatedFailure("badhost");
889 host_resolver_->set_rules(rules.get()); 901 host_resolver_->set_rules(rules.get());
890 902
891 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 903 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
892 ASSERT_EQ(ERR_IO_PENDING, 904 ASSERT_EQ(
893 transaction_.Start(&request_info, callback_.callback(), 905 ERR_IO_PENDING,
894 BoundNetLog())); 906 transaction_.Start(&request_info, callback_.callback(), BoundNetLog()));
895 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); 907 ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
896 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 908 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
897 } 909 }
898 910
899 // Check that when determining the host, the square brackets decorating IPv6 911 // Check that when determining the host, the square brackets decorating IPv6
900 // literals in URLs are stripped. 912 // literals in URLs are stripped.
901 TEST_P(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { 913 TEST_P(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) {
902 // This test only makes sense for IPv6 connections. 914 // This test only makes sense for IPv6 connections.
903 if (GetFamily() != AF_INET6) 915 if (GetFamily() != AF_INET6)
904 return; 916 return;
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 FtpSocketDataProvider::PRE_QUIT); 1114 FtpSocketDataProvider::PRE_QUIT);
1103 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); 1115 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT);
1104 } 1116 }
1105 1117
1106 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { 1118 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) {
1107 FtpSocketDataProviderEvilPasv ctrl_socket( 1119 FtpSocketDataProviderEvilPasv ctrl_socket(
1108 "227 Portscan (10,1,2,3,123,456)\r\n", FtpSocketDataProvider::PRE_SIZE); 1120 "227 Portscan (10,1,2,3,123,456)\r\n", FtpSocketDataProvider::PRE_SIZE);
1109 ctrl_socket.set_use_epsv(GetFamily() != AF_INET); 1121 ctrl_socket.set_use_epsv(GetFamily() != AF_INET);
1110 std::string mock_data("mock-data"); 1122 std::string mock_data("mock-data");
1111 MockRead data_reads[] = { 1123 MockRead data_reads[] = {
1112 MockRead(mock_data.c_str()), 1124 MockRead(mock_data.c_str()),
1113 }; 1125 };
1114 StaticSocketDataProvider data_socket1; 1126 StaticSocketDataProvider data_socket1;
1115 StaticSocketDataProvider data_socket2(data_reads, arraysize(data_reads), 1127 StaticSocketDataProvider data_socket2(
1116 NULL, 0); 1128 data_reads, arraysize(data_reads), NULL, 0);
1117 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); 1129 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket);
1118 mock_socket_factory_.AddSocketDataProvider(&data_socket1); 1130 mock_socket_factory_.AddSocketDataProvider(&data_socket1);
1119 mock_socket_factory_.AddSocketDataProvider(&data_socket2); 1131 mock_socket_factory_.AddSocketDataProvider(&data_socket2);
1120 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); 1132 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file");
1121 1133
1122 // Start the transaction. 1134 // Start the transaction.
1123 ASSERT_EQ(ERR_IO_PENDING, 1135 ASSERT_EQ(
1124 transaction_.Start(&request_info, callback_.callback(), 1136 ERR_IO_PENDING,
1125 BoundNetLog())); 1137 transaction_.Start(&request_info, callback_.callback(), BoundNetLog()));
1126 ASSERT_EQ(OK, callback_.WaitForResult()); 1138 ASSERT_EQ(OK, callback_.WaitForResult());
1127 1139
1128 // The transaction fires the callback when we can start reading data. That 1140 // The transaction fires the callback when we can start reading data. That
1129 // means that the data socket should be open. 1141 // means that the data socket should be open.
1130 MockTCPClientSocket* data_socket = 1142 MockTCPClientSocket* data_socket =
1131 static_cast<MockTCPClientSocket*>(transaction_.data_socket_.get()); 1143 static_cast<MockTCPClientSocket*>(transaction_.data_socket_.get());
1132 ASSERT_TRUE(data_socket); 1144 ASSERT_TRUE(data_socket);
1133 ASSERT_TRUE(data_socket->IsConnected()); 1145 ASSERT_TRUE(data_socket->IsConnected());
1134 1146
1135 // Even if the PASV response specified some other address, we connect 1147 // Even if the PASV response specified some other address, we connect
1136 // to the address we used for control connection (which could be 127.0.0.1 1148 // to the address we used for control connection (which could be 127.0.0.1
1137 // or ::1 depending on whether we use IPv6). 1149 // or ::1 depending on whether we use IPv6).
1138 for (AddressList::const_iterator it = data_socket->addresses().begin(); 1150 for (AddressList::const_iterator it = data_socket->addresses().begin();
1139 it != data_socket->addresses().end(); ++it) { 1151 it != data_socket->addresses().end();
1152 ++it) {
1140 EXPECT_NE("10.1.2.3", it->ToStringWithoutPort()); 1153 EXPECT_NE("10.1.2.3", it->ToStringWithoutPort());
1141 } 1154 }
1142 } 1155 }
1143 1156
1144 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) { 1157 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) {
1145 // This test makes no sense for IPv4 connections (we don't use EPSV there). 1158 // This test makes no sense for IPv4 connections (we don't use EPSV there).
1146 if (GetFamily() == AF_INET) 1159 if (GetFamily() == AF_INET)
1147 return; 1160 return;
1148 1161
1149 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n", 1162 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n",
(...skipping 30 matching lines...) Expand all
1180 FtpSocketDataProvider::PRE_QUIT); 1193 FtpSocketDataProvider::PRE_QUIT);
1181 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); 1194 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE);
1182 } 1195 }
1183 1196
1184 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) { 1197 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) {
1185 // This test makes no sense for IPv4 connections (we don't use EPSV there). 1198 // This test makes no sense for IPv4 connections (we don't use EPSV there).
1186 if (GetFamily() == AF_INET) 1199 if (GetFamily() == AF_INET)
1187 return; 1200 return;
1188 1201
1189 const char response[] = "227 Portscan (\0\0\031773\0)\r\n"; 1202 const char response[] = "227 Portscan (\0\0\031773\0)\r\n";
1190 FtpSocketDataProviderEvilEpsv ctrl_socket(response, sizeof(response)-1, 1203 FtpSocketDataProviderEvilEpsv ctrl_socket(
1191 FtpSocketDataProvider::PRE_QUIT); 1204 response, sizeof(response) - 1, FtpSocketDataProvider::PRE_QUIT);
1192 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); 1205 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE);
1193 } 1206 }
1194 1207
1195 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) { 1208 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) {
1196 // This test makes no sense for IPv4 connections (we don't use EPSV there). 1209 // This test makes no sense for IPv4 connections (we don't use EPSV there).
1197 if (GetFamily() == AF_INET) 1210 if (GetFamily() == AF_INET)
1198 return; 1211 return;
1199 1212
1200 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n", 1213 FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n",
1201 FtpSocketDataProvider::PRE_QUIT); 1214 FtpSocketDataProvider::PRE_QUIT);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1285 1298
1286 TEST_P(FtpNetworkTransactionTest, EvilRestartUser) { 1299 TEST_P(FtpNetworkTransactionTest, EvilRestartUser) {
1287 FtpSocketDataProvider ctrl_socket1; 1300 FtpSocketDataProvider ctrl_socket1;
1288 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, 1301 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD,
1289 FtpSocketDataProvider::PRE_QUIT, 1302 FtpSocketDataProvider::PRE_QUIT,
1290 "530 Login authentication failed\r\n"); 1303 "530 Login authentication failed\r\n");
1291 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); 1304 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1);
1292 1305
1293 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); 1306 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file");
1294 1307
1295 ASSERT_EQ(ERR_IO_PENDING, 1308 ASSERT_EQ(
1296 transaction_.Start(&request_info, callback_.callback(), 1309 ERR_IO_PENDING,
1297 BoundNetLog())); 1310 transaction_.Start(&request_info, callback_.callback(), BoundNetLog()));
1298 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); 1311 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult());
1299 1312
1300 MockRead ctrl_reads[] = { 1313 MockRead ctrl_reads[] = {
1301 MockRead("220 host TestFTPd\r\n"), 1314 MockRead("220 host TestFTPd\r\n"), MockRead("221 Goodbye!\r\n"),
1302 MockRead("221 Goodbye!\r\n"), 1315 MockRead(SYNCHRONOUS, OK),
1303 MockRead(SYNCHRONOUS, OK),
1304 }; 1316 };
1305 MockWrite ctrl_writes[] = { 1317 MockWrite ctrl_writes[] = {
1306 MockWrite("QUIT\r\n"), 1318 MockWrite("QUIT\r\n"),
1307 }; 1319 };
1308 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), 1320 StaticSocketDataProvider ctrl_socket2(
1309 ctrl_writes, arraysize(ctrl_writes)); 1321 ctrl_reads, arraysize(ctrl_reads), ctrl_writes, arraysize(ctrl_writes));
1310 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); 1322 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2);
1311 ASSERT_EQ(ERR_IO_PENDING, 1323 ASSERT_EQ(ERR_IO_PENDING,
1312 transaction_.RestartWithAuth( 1324 transaction_.RestartWithAuth(
1313 AuthCredentials( 1325 AuthCredentials(base::ASCIIToUTF16("foo\nownz0red"),
1314 base::ASCIIToUTF16("foo\nownz0red"), 1326 base::ASCIIToUTF16("innocent")),
1315 base::ASCIIToUTF16("innocent")),
1316 callback_.callback())); 1327 callback_.callback()));
1317 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); 1328 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult());
1318 } 1329 }
1319 1330
1320 TEST_P(FtpNetworkTransactionTest, EvilRestartPassword) { 1331 TEST_P(FtpNetworkTransactionTest, EvilRestartPassword) {
1321 FtpSocketDataProvider ctrl_socket1; 1332 FtpSocketDataProvider ctrl_socket1;
1322 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, 1333 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD,
1323 FtpSocketDataProvider::PRE_QUIT, 1334 FtpSocketDataProvider::PRE_QUIT,
1324 "530 Login authentication failed\r\n"); 1335 "530 Login authentication failed\r\n");
1325 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); 1336 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1);
1326 1337
1327 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); 1338 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file");
1328 1339
1329 ASSERT_EQ(ERR_IO_PENDING, 1340 ASSERT_EQ(
1330 transaction_.Start(&request_info, callback_.callback(), 1341 ERR_IO_PENDING,
1331 BoundNetLog())); 1342 transaction_.Start(&request_info, callback_.callback(), BoundNetLog()));
1332 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); 1343 ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult());
1333 1344
1334 MockRead ctrl_reads[] = { 1345 MockRead ctrl_reads[] = {
1335 MockRead("220 host TestFTPd\r\n"), 1346 MockRead("220 host TestFTPd\r\n"),
1336 MockRead("331 User okay, send password\r\n"), 1347 MockRead("331 User okay, send password\r\n"),
1337 MockRead("221 Goodbye!\r\n"), 1348 MockRead("221 Goodbye!\r\n"), MockRead(SYNCHRONOUS, OK),
1338 MockRead(SYNCHRONOUS, OK),
1339 }; 1349 };
1340 MockWrite ctrl_writes[] = { 1350 MockWrite ctrl_writes[] = {
1341 MockWrite("USER innocent\r\n"), 1351 MockWrite("USER innocent\r\n"), MockWrite("QUIT\r\n"),
1342 MockWrite("QUIT\r\n"),
1343 }; 1352 };
1344 StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), 1353 StaticSocketDataProvider ctrl_socket2(
1345 ctrl_writes, arraysize(ctrl_writes)); 1354 ctrl_reads, arraysize(ctrl_reads), ctrl_writes, arraysize(ctrl_writes));
1346 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); 1355 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2);
1347 ASSERT_EQ(ERR_IO_PENDING, 1356 ASSERT_EQ(ERR_IO_PENDING,
1348 transaction_.RestartWithAuth( 1357 transaction_.RestartWithAuth(
1349 AuthCredentials(base::ASCIIToUTF16("innocent"), 1358 AuthCredentials(base::ASCIIToUTF16("innocent"),
1350 base::ASCIIToUTF16("foo\nownz0red")), 1359 base::ASCIIToUTF16("foo\nownz0red")),
1351 callback_.callback())); 1360 callback_.callback()));
1352 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); 1361 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult());
1353 } 1362 }
1354 1363
1355 TEST_P(FtpNetworkTransactionTest, Escaping) { 1364 TEST_P(FtpNetworkTransactionTest, Escaping) {
1356 FtpSocketDataProviderEscaping ctrl_socket; 1365 FtpSocketDataProviderEscaping ctrl_socket;
1357 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", 1366 ExecuteTransaction(
1358 1, OK); 1367 &ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", 1, OK);
1359 } 1368 }
1360 1369
1361 // Test for http://crbug.com/23794. 1370 // Test for http://crbug.com/23794.
1362 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { 1371 TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) {
1363 // Try to overflow int64 in the response. 1372 // Try to overflow int64 in the response.
1364 FtpSocketDataProviderEvilSize ctrl_socket( 1373 FtpSocketDataProviderEvilSize ctrl_socket(
1365 "213 99999999999999999999999999999999\r\n", 1374 "213 99999999999999999999999999999999\r\n",
1366 FtpSocketDataProvider::PRE_QUIT); 1375 FtpSocketDataProvider::PRE_QUIT);
1367 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); 1376 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE);
1368 } 1377 }
1369 1378
1370 // Test for http://crbug.com/36360. 1379 // Test for http://crbug.com/36360.
1371 TEST_P(FtpNetworkTransactionTest, DownloadTransactionBigSize) { 1380 TEST_P(FtpNetworkTransactionTest, DownloadTransactionBigSize) {
1372 // Pass a valid, but large file size. The transaction should not fail. 1381 // Pass a valid, but large file size. The transaction should not fail.
1373 FtpSocketDataProviderEvilSize ctrl_socket( 1382 FtpSocketDataProviderEvilSize ctrl_socket("213 3204427776\r\n",
1374 "213 3204427776\r\n", 1383 FtpSocketDataProvider::PRE_CWD);
1375 FtpSocketDataProvider::PRE_CWD);
1376 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); 1384 ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK);
1377 EXPECT_EQ(3204427776LL, 1385 EXPECT_EQ(3204427776LL,
1378 transaction_.GetResponseInfo()->expected_content_size); 1386 transaction_.GetResponseInfo()->expected_content_size);
1379 } 1387 }
1380 1388
1381 // Regression test for http://crbug.com/25023. 1389 // Regression test for http://crbug.com/25023.
1382 TEST_P(FtpNetworkTransactionTest, CloseConnection) { 1390 TEST_P(FtpNetworkTransactionTest, CloseConnection) {
1383 FtpSocketDataProviderCloseConnection ctrl_socket; 1391 FtpSocketDataProviderCloseConnection ctrl_socket;
1384 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, ERR_EMPTY_RESPONSE); 1392 ExecuteTransaction(&ctrl_socket, "ftp://host", 1, ERR_EMPTY_RESPONSE);
1385 } 1393 }
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1593 FtpSocketDataProvider::PRE_TYPE, 1601 FtpSocketDataProvider::PRE_TYPE,
1594 "257 \"\"\r\n", 1602 "257 \"\"\r\n",
1595 OK); 1603 OK);
1596 } 1604 }
1597 1605
1598 INSTANTIATE_TEST_CASE_P(FTP, 1606 INSTANTIATE_TEST_CASE_P(FTP,
1599 FtpNetworkTransactionTest, 1607 FtpNetworkTransactionTest,
1600 ::testing::Values(AF_INET, AF_INET6)); 1608 ::testing::Values(AF_INET, AF_INET6));
1601 1609
1602 } // namespace net 1610 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698