OLD | NEW |
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/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 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
10 #include <ws2tcpip.h> | 10 #include <ws2tcpip.h> |
(...skipping 15 matching lines...) Expand all Loading... |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 // Size we use for IOBuffers used to receive data from the test data socket. | 29 // Size we use for IOBuffers used to receive data from the test data socket. |
30 const int kBufferSize = 128; | 30 const int kBufferSize = 128; |
31 | 31 |
32 } // namespace | 32 } // namespace |
33 | 33 |
34 namespace net { | 34 namespace net { |
35 | 35 |
36 class FtpMockControlSocket : public DynamicMockSocket { | 36 class FtpSocketDataProvider : public DynamicSocketDataProvider { |
37 public: | 37 public: |
38 enum State { | 38 enum State { |
39 NONE, | 39 NONE, |
40 PRE_USER, | 40 PRE_USER, |
41 PRE_PASSWD, | 41 PRE_PASSWD, |
42 PRE_SYST, | 42 PRE_SYST, |
43 PRE_PWD, | 43 PRE_PWD, |
44 PRE_TYPE, | 44 PRE_TYPE, |
45 PRE_PASV, | 45 PRE_PASV, |
46 PRE_SIZE, | 46 PRE_SIZE, |
47 PRE_MDTM, | 47 PRE_MDTM, |
48 PRE_LIST, | 48 PRE_LIST, |
49 PRE_RETR, | 49 PRE_RETR, |
50 PRE_PASV2, | 50 PRE_PASV2, |
51 PRE_CWD, | 51 PRE_CWD, |
52 PRE_QUIT, | 52 PRE_QUIT, |
53 QUIT | 53 QUIT |
54 }; | 54 }; |
55 | 55 |
56 FtpMockControlSocket() | 56 FtpSocketDataProvider() |
57 : failure_injection_state_(NONE), | 57 : failure_injection_state_(NONE), |
58 multiline_welcome_(false) { | 58 multiline_welcome_(false) { |
59 Init(); | 59 Init(); |
60 } | 60 } |
61 | 61 |
62 virtual MockWriteResult OnWrite(const std::string& data) { | 62 virtual MockWriteResult OnWrite(const std::string& data) { |
63 if (InjectFault()) | 63 if (InjectFault()) |
64 return MockWriteResult(true, data.length()); | 64 return MockWriteResult(true, data.length()); |
65 switch (state()) { | 65 switch (state()) { |
66 case PRE_USER: | 66 case PRE_USER: |
(...skipping 10 matching lines...) Expand all Loading... |
77 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); | 77 return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); |
78 case PRE_PWD: | 78 case PRE_PWD: |
79 return Verify("PWD\r\n", data, PRE_TYPE, | 79 return Verify("PWD\r\n", data, PRE_TYPE, |
80 "257 \"/\" is your current location\r\n"); | 80 "257 \"/\" is your current location\r\n"); |
81 case PRE_TYPE: | 81 case PRE_TYPE: |
82 return Verify("TYPE I\r\n", data, PRE_PASV, | 82 return Verify("TYPE I\r\n", data, PRE_PASV, |
83 "200 TYPE is now 8-bit binary\r\n"); | 83 "200 TYPE is now 8-bit binary\r\n"); |
84 case PRE_PASV: | 84 case PRE_PASV: |
85 return Verify("PASV\r\n", data, PRE_SIZE, | 85 return Verify("PASV\r\n", data, PRE_SIZE, |
86 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | 86 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
87 case PRE_PASV2:» | 87 case PRE_PASV2: |
88 // Parser should also accept format without parentheses.» | 88 // Parser should also accept format without parentheses. |
89 return Verify("PASV\r\n", data, PRE_CWD,» | 89 return Verify("PASV\r\n", data, PRE_CWD, |
90 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); | 90 "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
91 case PRE_QUIT: | 91 case PRE_QUIT: |
92 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); | 92 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); |
93 default: | 93 default: |
94 NOTREACHED() << "State not handled " << state(); | 94 NOTREACHED() << "State not handled " << state(); |
95 return MockWriteResult(true, ERR_UNEXPECTED); | 95 return MockWriteResult(true, ERR_UNEXPECTED); |
96 } | 96 } |
97 } | 97 } |
98 | 98 |
99 void InjectFailure(State state, State next_state, const char* response) { | 99 void InjectFailure(State state, State next_state, const char* response) { |
100 DCHECK_EQ(NONE, failure_injection_state_); | 100 DCHECK_EQ(NONE, failure_injection_state_); |
101 DCHECK_NE(NONE, state); | 101 DCHECK_NE(NONE, state); |
102 DCHECK_NE(NONE, next_state); | 102 DCHECK_NE(NONE, next_state); |
103 DCHECK_NE(state, next_state); | 103 DCHECK_NE(state, next_state); |
104 failure_injection_state_ = state; | 104 failure_injection_state_ = state; |
105 failure_injection_next_state_ = next_state; | 105 failure_injection_next_state_ = next_state; |
106 fault_response_ = response; | 106 fault_response_ = response; |
107 } | 107 } |
108 | 108 |
109 State state() const { | 109 State state() const { |
110 return state_; | 110 return state_; |
111 } | 111 } |
112 | 112 |
113 virtual void Reset() { | 113 virtual void Reset() { |
114 DynamicMockSocket::Reset(); | 114 DynamicSocketDataProvider::Reset(); |
115 Init(); | 115 Init(); |
116 } | 116 } |
117 | 117 |
118 void set_multiline_welcome(bool multiline) { | 118 void set_multiline_welcome(bool multiline) { |
119 multiline_welcome_ = multiline; | 119 multiline_welcome_ = multiline; |
120 } | 120 } |
121 | 121 |
122 protected: | 122 protected: |
123 void Init() { | 123 void Init() { |
124 state_ = PRE_USER; | 124 state_ = PRE_USER; |
(...skipping 25 matching lines...) Expand all Loading... |
150 | 150 |
151 private: | 151 private: |
152 State state_; | 152 State state_; |
153 State failure_injection_state_; | 153 State failure_injection_state_; |
154 State failure_injection_next_state_; | 154 State failure_injection_next_state_; |
155 const char* fault_response_; | 155 const char* fault_response_; |
156 | 156 |
157 // If true, we will send multiple 230 lines as response after PASS. | 157 // If true, we will send multiple 230 lines as response after PASS. |
158 bool multiline_welcome_; | 158 bool multiline_welcome_; |
159 | 159 |
160 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocket); | 160 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProvider); |
161 }; | 161 }; |
162 | 162 |
163 class FtpMockControlSocketDirectoryListing : public FtpMockControlSocket { | 163 class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { |
164 public: | 164 public: |
165 FtpMockControlSocketDirectoryListing() { | 165 FtpSocketDataProviderDirectoryListing() { |
166 } | 166 } |
167 | 167 |
168 virtual MockWriteResult OnWrite(const std::string& data) { | 168 virtual MockWriteResult OnWrite(const std::string& data) { |
169 if (InjectFault()) | 169 if (InjectFault()) |
170 return MockWriteResult(true, data.length()); | 170 return MockWriteResult(true, data.length()); |
171 switch (state()) { | 171 switch (state()) { |
172 case PRE_SIZE: | 172 case PRE_SIZE: |
173 return Verify("SIZE /\r\n", data, PRE_MDTM, | 173 return Verify("SIZE /\r\n", data, PRE_MDTM, |
174 "550 I can only retrieve regular files\r\n"); | 174 "550 I can only retrieve regular files\r\n"); |
175 case PRE_MDTM: | 175 case PRE_MDTM: |
176 return Verify("MDTM /\r\n", data, PRE_RETR, | 176 return Verify("MDTM /\r\n", data, PRE_RETR, |
177 "213 20070221112533\r\n"); | 177 "213 20070221112533\r\n"); |
178 case PRE_RETR: | 178 case PRE_RETR: |
179 return Verify("RETR /\r\n", data, PRE_PASV2, | 179 return Verify("RETR /\r\n", data, PRE_PASV2, |
180 "550 Can't download directory\r\n"); | 180 "550 Can't download directory\r\n"); |
181 | 181 |
182 case PRE_CWD: | 182 case PRE_CWD: |
183 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); | 183 return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); |
184 case PRE_LIST: | 184 case PRE_LIST: |
185 // TODO(phajdan.jr): Also test with "150 Accepted Data Connection". | 185 // TODO(phajdan.jr): Also test with "150 Accepted Data Connection". |
186 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); | 186 return Verify("LIST\r\n", data, PRE_QUIT, "200 OK\r\n"); |
187 default: | 187 default: |
188 return FtpMockControlSocket::OnWrite(data); | 188 return FtpSocketDataProvider::OnWrite(data); |
189 } | 189 } |
190 } | 190 } |
191 | 191 |
192 private: | 192 private: |
193 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketDirectoryListing); | 193 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing); |
194 }; | 194 }; |
195 | 195 |
196 class FtpMockControlSocketVMSDirectoryListing : public FtpMockControlSocket { | 196 class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { |
197 public: | 197 public: |
198 FtpMockControlSocketVMSDirectoryListing() { | 198 FtpSocketDataProviderVMSDirectoryListing() { |
199 } | 199 } |
200 | 200 |
201 virtual MockWriteResult OnWrite(const std::string& data) { | 201 virtual MockWriteResult OnWrite(const std::string& data) { |
202 if (InjectFault()) | 202 if (InjectFault()) |
203 return MockWriteResult(true, data.length()); | 203 return MockWriteResult(true, data.length()); |
204 switch (state()) { | 204 switch (state()) { |
205 case PRE_SYST: | 205 case PRE_SYST: |
206 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 206 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
207 case PRE_PWD: | 207 case PRE_PWD: |
208 return Verify("PWD\r\n", data, PRE_TYPE, | 208 return Verify("PWD\r\n", data, PRE_TYPE, |
209 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 209 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
210 case PRE_SIZE: | 210 case PRE_SIZE: |
211 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_MDTM, | 211 return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_MDTM, |
212 "550 I can only retrieve regular files\r\n"); | 212 "550 I can only retrieve regular files\r\n"); |
213 case PRE_MDTM: | 213 case PRE_MDTM: |
214 return Verify("MDTM ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_RETR, | 214 return Verify("MDTM ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_RETR, |
215 "213 20070221112533\r\n"); | 215 "213 20070221112533\r\n"); |
216 case PRE_RETR: | 216 case PRE_RETR: |
217 return Verify("RETR ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_PASV2, | 217 return Verify("RETR ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_PASV2, |
218 "550 Can't download directory\r\n"); | 218 "550 Can't download directory\r\n"); |
219 case PRE_CWD: | 219 case PRE_CWD: |
220 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, | 220 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, |
221 "200 OK\r\n"); | 221 "200 OK\r\n"); |
222 case PRE_LIST: | 222 case PRE_LIST: |
223 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 223 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
224 default: | 224 default: |
225 return FtpMockControlSocket::OnWrite(data); | 225 return FtpSocketDataProvider::OnWrite(data); |
226 } | 226 } |
227 } | 227 } |
228 | 228 |
229 private: | 229 private: |
230 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketVMSDirectoryListing); | 230 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing); |
231 }; | 231 }; |
232 | 232 |
233 class FtpMockControlSocketVMSDirectoryListingRootDirectory | 233 class FtpSocketDataProviderVMSDirectoryListingRootDirectory |
234 : public FtpMockControlSocket { | 234 : public FtpSocketDataProvider { |
235 public: | 235 public: |
236 FtpMockControlSocketVMSDirectoryListingRootDirectory() { | 236 FtpSocketDataProviderVMSDirectoryListingRootDirectory() { |
237 } | 237 } |
238 | 238 |
239 virtual MockWriteResult OnWrite(const std::string& data) { | 239 virtual MockWriteResult OnWrite(const std::string& data) { |
240 if (InjectFault()) | 240 if (InjectFault()) |
241 return MockWriteResult(true, data.length()); | 241 return MockWriteResult(true, data.length()); |
242 switch (state()) { | 242 switch (state()) { |
243 case PRE_SYST: | 243 case PRE_SYST: |
244 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 244 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
245 case PRE_PWD: | 245 case PRE_PWD: |
246 return Verify("PWD\r\n", data, PRE_TYPE, | 246 return Verify("PWD\r\n", data, PRE_TYPE, |
247 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 247 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
248 case PRE_SIZE: | 248 case PRE_SIZE: |
249 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_MDTM, | 249 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_MDTM, |
250 "550 I can only retrieve regular files\r\n"); | 250 "550 I can only retrieve regular files\r\n"); |
251 case PRE_MDTM: | 251 case PRE_MDTM: |
252 return Verify("MDTM ANONYMOUS_ROOT\r\n", data, PRE_RETR, | 252 return Verify("MDTM ANONYMOUS_ROOT\r\n", data, PRE_RETR, |
253 "213 20070221112533\r\n"); | 253 "213 20070221112533\r\n"); |
254 case PRE_RETR: | 254 case PRE_RETR: |
255 return Verify("RETR ANONYMOUS_ROOT\r\n", data, PRE_PASV2, | 255 return Verify("RETR ANONYMOUS_ROOT\r\n", data, PRE_PASV2, |
256 "550 Can't download directory\r\n"); | 256 "550 Can't download directory\r\n"); |
257 case PRE_CWD: | 257 case PRE_CWD: |
258 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, | 258 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, |
259 "200 OK\r\n"); | 259 "200 OK\r\n"); |
260 case PRE_LIST: | 260 case PRE_LIST: |
261 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); | 261 return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
262 default: | 262 default: |
263 return FtpMockControlSocket::OnWrite(data); | 263 return FtpSocketDataProvider::OnWrite(data); |
264 } | 264 } |
265 } | 265 } |
266 | 266 |
267 private: | 267 private: |
268 DISALLOW_COPY_AND_ASSIGN( | 268 DISALLOW_COPY_AND_ASSIGN( |
269 FtpMockControlSocketVMSDirectoryListingRootDirectory); | 269 FtpSocketDataProviderVMSDirectoryListingRootDirectory); |
270 }; | 270 }; |
271 | 271 |
272 class FtpMockControlSocketFileDownload : public FtpMockControlSocket { | 272 class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { |
273 public: | 273 public: |
274 FtpMockControlSocketFileDownload() { | 274 FtpSocketDataProviderFileDownload() { |
275 } | 275 } |
276 | 276 |
277 virtual MockWriteResult OnWrite(const std::string& data) { | 277 virtual MockWriteResult OnWrite(const std::string& data) { |
278 if (InjectFault()) | 278 if (InjectFault()) |
279 return MockWriteResult(true, data.length()); | 279 return MockWriteResult(true, data.length()); |
280 switch (state()) { | 280 switch (state()) { |
281 case PRE_SIZE: | 281 case PRE_SIZE: |
282 return Verify("SIZE /file\r\n", data, PRE_MDTM, | 282 return Verify("SIZE /file\r\n", data, PRE_MDTM, |
283 "213 18\r\n"); | 283 "213 18\r\n"); |
284 case PRE_MDTM: | 284 case PRE_MDTM: |
285 return Verify("MDTM /file\r\n", data, PRE_RETR, | 285 return Verify("MDTM /file\r\n", data, PRE_RETR, |
286 "213 20070221112533\r\n"); | 286 "213 20070221112533\r\n"); |
287 case PRE_RETR: | 287 case PRE_RETR: |
288 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); | 288 return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); |
289 default: | 289 default: |
290 return FtpMockControlSocket::OnWrite(data); | 290 return FtpSocketDataProvider::OnWrite(data); |
291 } | 291 } |
292 } | 292 } |
293 | 293 |
294 private: | 294 private: |
295 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketFileDownload); | 295 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownload); |
296 }; | 296 }; |
297 | 297 |
298 class FtpMockControlSocketVMSFileDownload : public FtpMockControlSocket { | 298 class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { |
299 public: | 299 public: |
300 FtpMockControlSocketVMSFileDownload() { | 300 FtpSocketDataProviderVMSFileDownload() { |
301 } | 301 } |
302 | 302 |
303 virtual MockWriteResult OnWrite(const std::string& data) { | 303 virtual MockWriteResult OnWrite(const std::string& data) { |
304 if (InjectFault()) | 304 if (InjectFault()) |
305 return MockWriteResult(true, data.length()); | 305 return MockWriteResult(true, data.length()); |
306 switch (state()) { | 306 switch (state()) { |
307 case PRE_SYST: | 307 case PRE_SYST: |
308 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); | 308 return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
309 case PRE_PWD: | 309 case PRE_PWD: |
310 return Verify("PWD\r\n", data, PRE_TYPE, | 310 return Verify("PWD\r\n", data, PRE_TYPE, |
311 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); | 311 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
312 case PRE_SIZE: | 312 case PRE_SIZE: |
313 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_MDTM, | 313 return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_MDTM, |
314 "213 18\r\n"); | 314 "213 18\r\n"); |
315 case PRE_MDTM: | 315 case PRE_MDTM: |
316 return Verify("MDTM ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_RETR, | 316 return Verify("MDTM ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_RETR, |
317 "213 20070221112533\r\n"); | 317 "213 20070221112533\r\n"); |
318 case PRE_RETR: | 318 case PRE_RETR: |
319 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, | 319 return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, |
320 "200 OK\r\n"); | 320 "200 OK\r\n"); |
321 default: | 321 default: |
322 return FtpMockControlSocket::OnWrite(data); | 322 return FtpSocketDataProvider::OnWrite(data); |
323 } | 323 } |
324 } | 324 } |
325 | 325 |
326 private: | 326 private: |
327 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketVMSFileDownload); | 327 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload); |
328 }; | 328 }; |
329 | 329 |
330 class FtpMockControlSocketEscaping : public FtpMockControlSocket { | 330 class FtpSocketDataProviderEscaping : public FtpSocketDataProvider { |
331 public: | 331 public: |
332 FtpMockControlSocketEscaping() { | 332 FtpSocketDataProviderEscaping() { |
333 } | 333 } |
334 | 334 |
335 virtual MockWriteResult OnWrite(const std::string& data) { | 335 virtual MockWriteResult OnWrite(const std::string& data) { |
336 if (InjectFault()) | 336 if (InjectFault()) |
337 return MockWriteResult(true, data.length()); | 337 return MockWriteResult(true, data.length()); |
338 switch (state()) { | 338 switch (state()) { |
339 case PRE_SIZE: | 339 case PRE_SIZE: |
340 return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_MDTM, | 340 return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_MDTM, |
341 "213 18\r\n"); | 341 "213 18\r\n"); |
342 case PRE_MDTM: | 342 case PRE_MDTM: |
343 return Verify("MDTM / !\"#$%y\200\201\r\n", data, PRE_RETR, | 343 return Verify("MDTM / !\"#$%y\200\201\r\n", data, PRE_RETR, |
344 "213 20070221112533\r\n"); | 344 "213 20070221112533\r\n"); |
345 case PRE_RETR: | 345 case PRE_RETR: |
346 return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, | 346 return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, |
347 "200 OK\r\n"); | 347 "200 OK\r\n"); |
348 default: | 348 default: |
349 return FtpMockControlSocket::OnWrite(data); | 349 return FtpSocketDataProvider::OnWrite(data); |
350 } | 350 } |
351 } | 351 } |
352 | 352 |
353 private: | 353 private: |
354 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketEscaping); | 354 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping); |
355 }; | 355 }; |
356 | 356 |
357 class FtpMockControlSocketFileDownloadAcceptedDataConnection | 357 class FtpSocketDataProviderFileDownloadAcceptedDataConnection |
358 : public FtpMockControlSocketFileDownload { | 358 : public FtpSocketDataProviderFileDownload { |
359 public: | 359 public: |
360 FtpMockControlSocketFileDownloadAcceptedDataConnection() { | 360 FtpSocketDataProviderFileDownloadAcceptedDataConnection() { |
361 } | 361 } |
362 | 362 |
363 virtual MockWriteResult OnWrite(const std::string& data) { | 363 virtual MockWriteResult OnWrite(const std::string& data) { |
364 if (InjectFault()) | 364 if (InjectFault()) |
365 return MockWriteResult(true, data.length()); | 365 return MockWriteResult(true, data.length()); |
366 switch (state()) { | 366 switch (state()) { |
367 case PRE_RETR: | 367 case PRE_RETR: |
368 return Verify("RETR /file\r\n", data, PRE_QUIT, | 368 return Verify("RETR /file\r\n", data, PRE_QUIT, |
369 "150 Accepted Data Connection\r\n"); | 369 "150 Accepted Data Connection\r\n"); |
370 default: | 370 default: |
371 return FtpMockControlSocketFileDownload::OnWrite(data); | 371 return FtpSocketDataProviderFileDownload::OnWrite(data); |
372 } | 372 } |
373 } | 373 } |
374 | 374 |
375 private: | 375 private: |
376 DISALLOW_COPY_AND_ASSIGN( | 376 DISALLOW_COPY_AND_ASSIGN( |
377 FtpMockControlSocketFileDownloadAcceptedDataConnection); | 377 FtpSocketDataProviderFileDownloadAcceptedDataConnection); |
378 }; | 378 }; |
379 | 379 |
380 class FtpMockControlSocketFileDownloadTransferStarting | 380 class FtpSocketDataProviderFileDownloadTransferStarting |
381 : public FtpMockControlSocketFileDownload { | 381 : public FtpSocketDataProviderFileDownload { |
382 public: | 382 public: |
383 FtpMockControlSocketFileDownloadTransferStarting() { | 383 FtpSocketDataProviderFileDownloadTransferStarting() { |
384 } | 384 } |
385 | 385 |
386 virtual MockWriteResult OnWrite(const std::string& data) { | 386 virtual MockWriteResult OnWrite(const std::string& data) { |
387 if (InjectFault()) | 387 if (InjectFault()) |
388 return MockWriteResult(true, data.length()); | 388 return MockWriteResult(true, data.length()); |
389 switch (state()) { | 389 switch (state()) { |
390 case PRE_RETR: | 390 case PRE_RETR: |
391 return Verify("RETR /file\r\n", data, PRE_QUIT, | 391 return Verify("RETR /file\r\n", data, PRE_QUIT, |
392 "125-Data connection already open.\r\n" | 392 "125-Data connection already open.\r\n" |
393 "125 Transfer starting.\r\n" | 393 "125 Transfer starting.\r\n" |
394 "226 Transfer complete.\r\n"); | 394 "226 Transfer complete.\r\n"); |
395 default: | 395 default: |
396 return FtpMockControlSocketFileDownload::OnWrite(data); | 396 return FtpSocketDataProviderFileDownload::OnWrite(data); |
397 } | 397 } |
398 } | 398 } |
399 | 399 |
400 private: | 400 private: |
401 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketFileDownloadTransferStarting); | 401 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadTransferStarting); |
402 }; | 402 }; |
403 | 403 |
404 class FtpMockControlSocketFileDownloadInvalidResponse | 404 class FtpSocketDataProviderFileDownloadInvalidResponse |
405 : public FtpMockControlSocketFileDownload { | 405 : public FtpSocketDataProviderFileDownload { |
406 public: | 406 public: |
407 FtpMockControlSocketFileDownloadInvalidResponse() { | 407 FtpSocketDataProviderFileDownloadInvalidResponse() { |
408 } | 408 } |
409 | 409 |
410 virtual MockWriteResult OnWrite(const std::string& data) { | 410 virtual MockWriteResult OnWrite(const std::string& data) { |
411 if (InjectFault()) | 411 if (InjectFault()) |
412 return MockWriteResult(true, data.length()); | 412 return MockWriteResult(true, data.length()); |
413 switch (state()) { | 413 switch (state()) { |
414 case PRE_SIZE: | 414 case PRE_SIZE: |
415 return Verify("SIZE /file\r\n", data, PRE_QUIT, | 415 return Verify("SIZE /file\r\n", data, PRE_QUIT, |
416 "500 Evil Response\r\n" | 416 "500 Evil Response\r\n" |
417 "500 More Evil\r\n"); | 417 "500 More Evil\r\n"); |
418 default: | 418 default: |
419 return FtpMockControlSocketFileDownload::OnWrite(data); | 419 return FtpSocketDataProviderFileDownload::OnWrite(data); |
420 } | 420 } |
421 } | 421 } |
422 | 422 |
423 private: | 423 private: |
424 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketFileDownloadInvalidResponse); | 424 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse); |
425 }; | 425 }; |
426 | 426 |
427 class FtpMockControlSocketFileDownloadRetrFail | 427 class FtpSocketDataProviderFileDownloadRetrFail |
428 : public FtpMockControlSocketFileDownload { | 428 : public FtpSocketDataProviderFileDownload { |
429 public: | 429 public: |
430 FtpMockControlSocketFileDownloadRetrFail() { | 430 FtpSocketDataProviderFileDownloadRetrFail() { |
431 } | 431 } |
432 | 432 |
433 virtual MockWriteResult OnWrite(const std::string& data) { | 433 virtual MockWriteResult OnWrite(const std::string& data) { |
434 if (InjectFault()) | 434 if (InjectFault()) |
435 return MockWriteResult(true, data.length()); | 435 return MockWriteResult(true, data.length()); |
436 switch (state()) { | 436 switch (state()) { |
437 case PRE_CWD: | 437 case PRE_CWD: |
438 return Verify("CWD /file\r\n", data, PRE_QUIT, | 438 return Verify("CWD /file\r\n", data, PRE_QUIT, |
439 "550 file is a directory\r\n"); | 439 "550 file is a directory\r\n"); |
440 default: | 440 default: |
441 return FtpMockControlSocketFileDownload::OnWrite(data); | 441 return FtpSocketDataProviderFileDownload::OnWrite(data); |
442 } | 442 } |
443 } | 443 } |
444 | 444 |
445 private: | 445 private: |
446 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketFileDownloadRetrFail); | 446 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadRetrFail); |
447 }; | 447 }; |
448 | 448 |
449 class FtpMockControlSocketEvilPasv : public FtpMockControlSocketFileDownload { | 449 class FtpSocketDataProviderEvilPasv : public FtpSocketDataProviderFileDownload { |
450 public: | 450 public: |
451 explicit FtpMockControlSocketEvilPasv(const char* pasv_response, | 451 explicit FtpSocketDataProviderEvilPasv(const char* pasv_response, |
452 State expected_state) | 452 State expected_state) |
453 : pasv_response_(pasv_response), | 453 : pasv_response_(pasv_response), |
454 expected_state_(expected_state) { | 454 expected_state_(expected_state) { |
455 } | 455 } |
456 | 456 |
457 virtual MockWriteResult OnWrite(const std::string& data) { | 457 virtual MockWriteResult OnWrite(const std::string& data) { |
458 if (InjectFault()) | 458 if (InjectFault()) |
459 return MockWriteResult(true, data.length()); | 459 return MockWriteResult(true, data.length()); |
460 switch (state()) { | 460 switch (state()) { |
461 case PRE_PASV: | 461 case PRE_PASV: |
462 return Verify("PASV\r\n", data, expected_state_, pasv_response_); | 462 return Verify("PASV\r\n", data, expected_state_, pasv_response_); |
463 default: | 463 default: |
464 return FtpMockControlSocketFileDownload::OnWrite(data); | 464 return FtpSocketDataProviderFileDownload::OnWrite(data); |
465 } | 465 } |
466 } | 466 } |
467 | 467 |
468 private: | 468 private: |
469 const char* pasv_response_; | 469 const char* pasv_response_; |
470 const State expected_state_; | 470 const State expected_state_; |
471 | 471 |
472 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketEvilPasv); | 472 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilPasv); |
473 }; | 473 }; |
474 | 474 |
475 class FtpMockControlSocketEvilLogin : public FtpMockControlSocketFileDownload { | 475 class FtpSocketDataProviderEvilLogin : public FtpSocketDataProviderFileDownload
{ |
476 public: | 476 public: |
477 FtpMockControlSocketEvilLogin(const char* expected_user, | 477 FtpSocketDataProviderEvilLogin(const char* expected_user, |
478 const char* expected_password) | 478 const char* expected_password) |
479 : expected_user_(expected_user), | 479 : expected_user_(expected_user), |
480 expected_password_(expected_password) { | 480 expected_password_(expected_password) { |
481 } | 481 } |
482 | 482 |
483 virtual MockWriteResult OnWrite(const std::string& data) { | 483 virtual MockWriteResult OnWrite(const std::string& data) { |
484 if (InjectFault()) | 484 if (InjectFault()) |
485 return MockWriteResult(true, data.length()); | 485 return MockWriteResult(true, data.length()); |
486 switch (state()) { | 486 switch (state()) { |
487 case PRE_USER: | 487 case PRE_USER: |
488 return Verify(std::string("USER ") + expected_user_ + "\r\n", data, | 488 return Verify(std::string("USER ") + expected_user_ + "\r\n", data, |
489 PRE_PASSWD, "331 Password needed\r\n"); | 489 PRE_PASSWD, "331 Password needed\r\n"); |
490 case PRE_PASSWD: | 490 case PRE_PASSWD: |
491 return Verify(std::string("PASS ") + expected_password_ + "\r\n", data, | 491 return Verify(std::string("PASS ") + expected_password_ + "\r\n", data, |
492 PRE_SYST, "230 Welcome\r\n"); | 492 PRE_SYST, "230 Welcome\r\n"); |
493 default: | 493 default: |
494 return FtpMockControlSocketFileDownload::OnWrite(data); | 494 return FtpSocketDataProviderFileDownload::OnWrite(data); |
495 } | 495 } |
496 } | 496 } |
497 | 497 |
498 private: | 498 private: |
499 const char* expected_user_; | 499 const char* expected_user_; |
500 const char* expected_password_; | 500 const char* expected_password_; |
501 | 501 |
502 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketEvilLogin); | 502 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilLogin); |
503 }; | 503 }; |
504 | 504 |
505 class FtpMockControlSocketCloseConnection : public FtpMockControlSocket { | 505 class FtpSocketDataProviderCloseConnection : public FtpSocketDataProvider { |
506 public: | 506 public: |
507 FtpMockControlSocketCloseConnection() { | 507 FtpSocketDataProviderCloseConnection() { |
508 } | 508 } |
509 | 509 |
510 virtual MockWriteResult OnWrite(const std::string& data) { | 510 virtual MockWriteResult OnWrite(const std::string& data) { |
511 if (InjectFault()) | 511 if (InjectFault()) |
512 return MockWriteResult(true, data.length()); | 512 return MockWriteResult(true, data.length()); |
513 switch (state()) { | 513 switch (state()) { |
514 case PRE_USER: | 514 case PRE_USER: |
515 return Verify("USER anonymous\r\n", data, | 515 return Verify("USER anonymous\r\n", data, |
516 PRE_QUIT, ""); | 516 PRE_QUIT, ""); |
517 default: | 517 default: |
518 return FtpMockControlSocket::OnWrite(data); | 518 return FtpSocketDataProvider::OnWrite(data); |
519 } | 519 } |
520 } | 520 } |
521 | 521 |
522 private: | 522 private: |
523 DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketCloseConnection); | 523 DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderCloseConnection); |
524 }; | 524 }; |
525 | 525 |
526 class FtpNetworkTransactionTest : public PlatformTest { | 526 class FtpNetworkTransactionTest : public PlatformTest { |
527 public: | 527 public: |
528 FtpNetworkTransactionTest() | 528 FtpNetworkTransactionTest() |
529 : host_resolver_(new MockHostResolver), | 529 : host_resolver_(new MockHostResolver), |
530 session_(new FtpNetworkSession(host_resolver_)), | 530 session_(new FtpNetworkSession(host_resolver_)), |
531 transaction_(session_.get(), &mock_socket_factory_) { | 531 transaction_(session_.get(), &mock_socket_factory_) { |
532 } | 532 } |
533 | 533 |
534 protected: | 534 protected: |
535 FtpRequestInfo GetRequestInfo(const std::string& url) { | 535 FtpRequestInfo GetRequestInfo(const std::string& url) { |
536 FtpRequestInfo info; | 536 FtpRequestInfo info; |
537 info.url = GURL(url); | 537 info.url = GURL(url); |
538 return info; | 538 return info; |
539 } | 539 } |
540 | 540 |
541 void ExecuteTransaction(FtpMockControlSocket* ctrl_socket, | 541 void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket, |
542 const char* request, | 542 const char* request, |
543 int expected_result) { | 543 int expected_result) { |
544 std::string mock_data("mock-data"); | 544 std::string mock_data("mock-data"); |
545 MockRead data_reads[] = { | 545 MockRead data_reads[] = { |
546 MockRead(mock_data.c_str()), | 546 MockRead(mock_data.c_str()), |
547 }; | 547 }; |
548 // For compatibility with FileZilla, the transaction code will use two data | 548 // For compatibility with FileZilla, the transaction code will use two data |
549 // sockets for directory requests. For more info see http://crbug.com/25316. | 549 // sockets for directory requests. For more info see http://crbug.com/25316. |
550 StaticMockSocket data_socket1(data_reads, NULL); | 550 StaticSocketDataProvider data1(data_reads, NULL); |
551 StaticMockSocket data_socket2(data_reads, NULL); | 551 StaticSocketDataProvider data2(data_reads, NULL); |
552 mock_socket_factory_.AddMockSocket(ctrl_socket); | 552 mock_socket_factory_.AddSocketDataProvider(ctrl_socket); |
553 mock_socket_factory_.AddMockSocket(&data_socket1); | 553 mock_socket_factory_.AddSocketDataProvider(&data1); |
554 mock_socket_factory_.AddMockSocket(&data_socket2); | 554 mock_socket_factory_.AddSocketDataProvider(&data2); |
555 FtpRequestInfo request_info = GetRequestInfo(request); | 555 FtpRequestInfo request_info = GetRequestInfo(request); |
556 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 556 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
557 ASSERT_EQ(ERR_IO_PENDING, | 557 ASSERT_EQ(ERR_IO_PENDING, |
558 transaction_.Start(&request_info, &callback_, NULL)); | 558 transaction_.Start(&request_info, &callback_, NULL)); |
559 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 559 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
560 EXPECT_EQ(expected_result, callback_.WaitForResult()); | 560 EXPECT_EQ(expected_result, callback_.WaitForResult()); |
561 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state()); | 561 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); |
562 if (expected_result == OK) { | 562 if (expected_result == OK) { |
563 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 563 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
564 memset(io_buffer->data(), 0, kBufferSize); | 564 memset(io_buffer->data(), 0, kBufferSize); |
565 ASSERT_EQ(ERR_IO_PENDING, | 565 ASSERT_EQ(ERR_IO_PENDING, |
566 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | 566 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); |
567 EXPECT_EQ(static_cast<int>(mock_data.length()), | 567 EXPECT_EQ(static_cast<int>(mock_data.length()), |
568 callback_.WaitForResult()); | 568 callback_.WaitForResult()); |
569 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); | 569 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
570 } | 570 } |
571 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 571 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
572 } | 572 } |
573 | 573 |
574 void TransactionFailHelper(FtpMockControlSocket* ctrl_socket, | 574 void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, |
575 const char* request, | 575 const char* request, |
576 FtpMockControlSocket::State state, | 576 FtpSocketDataProvider::State state, |
577 FtpMockControlSocket::State next_state, | 577 FtpSocketDataProvider::State next_state, |
578 const char* response, | 578 const char* response, |
579 int expected_result) { | 579 int expected_result) { |
580 ctrl_socket->InjectFailure(state, next_state, response); | 580 ctrl_socket->InjectFailure(state, next_state, response); |
581 ExecuteTransaction(ctrl_socket, request, expected_result); | 581 ExecuteTransaction(ctrl_socket, request, expected_result); |
582 } | 582 } |
583 | 583 |
584 scoped_refptr<MockHostResolver> host_resolver_; | 584 scoped_refptr<MockHostResolver> host_resolver_; |
585 scoped_refptr<FtpNetworkSession> session_; | 585 scoped_refptr<FtpNetworkSession> session_; |
586 MockClientSocketFactory mock_socket_factory_; | 586 MockClientSocketFactory mock_socket_factory_; |
587 FtpNetworkTransaction transaction_; | 587 FtpNetworkTransaction transaction_; |
588 TestCompletionCallback callback_; | 588 TestCompletionCallback callback_; |
589 }; | 589 }; |
590 | 590 |
591 TEST_F(FtpNetworkTransactionTest, FailedLookup) { | 591 TEST_F(FtpNetworkTransactionTest, FailedLookup) { |
592 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); | 592 FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); |
593 host_resolver_->rules()->AddSimulatedFailure("badhost"); | 593 host_resolver_->rules()->AddSimulatedFailure("badhost"); |
594 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 594 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
595 ASSERT_EQ(ERR_IO_PENDING, | 595 ASSERT_EQ(ERR_IO_PENDING, |
596 transaction_.Start(&request_info, &callback_, NULL)); | 596 transaction_.Start(&request_info, &callback_, NULL)); |
597 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); | 597 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); |
598 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 598 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
599 } | 599 } |
600 | 600 |
601 TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { | 601 TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { |
602 FtpMockControlSocketDirectoryListing ctrl_socket; | 602 FtpSocketDataProviderDirectoryListing ctrl_socket; |
603 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 603 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
604 } | 604 } |
605 | 605 |
606 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { | 606 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { |
607 FtpMockControlSocketDirectoryListing ctrl_socket; | 607 FtpSocketDataProviderDirectoryListing ctrl_socket; |
608 ctrl_socket.set_multiline_welcome(true); | 608 ctrl_socket.set_multiline_welcome(true); |
609 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 609 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
610 } | 610 } |
611 | 611 |
612 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads2) { | 612 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads2) { |
613 FtpMockControlSocketDirectoryListing ctrl_socket; | 613 FtpSocketDataProviderDirectoryListing ctrl_socket; |
614 ctrl_socket.set_short_read_limit(2); | 614 ctrl_socket.set_short_read_limit(2); |
615 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 615 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
616 } | 616 } |
617 | 617 |
618 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads5) { | 618 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads5) { |
619 FtpMockControlSocketDirectoryListing ctrl_socket; | 619 FtpSocketDataProviderDirectoryListing ctrl_socket; |
620 ctrl_socket.set_short_read_limit(5); | 620 ctrl_socket.set_short_read_limit(5); |
621 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 621 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
622 } | 622 } |
623 | 623 |
624 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcomeShort) { | 624 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcomeShort) { |
625 FtpMockControlSocketDirectoryListing ctrl_socket; | 625 FtpSocketDataProviderDirectoryListing ctrl_socket; |
626 // The client will not consume all three 230 lines. That's good, we want to | 626 // The client will not consume all three 230 lines. That's good, we want to |
627 // test that scenario. | 627 // test that scenario. |
628 ctrl_socket.allow_unconsumed_reads(true); | 628 ctrl_socket.allow_unconsumed_reads(true); |
629 ctrl_socket.set_multiline_welcome(true); | 629 ctrl_socket.set_multiline_welcome(true); |
630 ctrl_socket.set_short_read_limit(5); | 630 ctrl_socket.set_short_read_limit(5); |
631 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 631 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
632 } | 632 } |
633 | 633 |
634 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionVMS) { | 634 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionVMS) { |
635 FtpMockControlSocketVMSDirectoryListing ctrl_socket; | 635 FtpSocketDataProviderVMSDirectoryListing ctrl_socket; |
636 ExecuteTransaction(&ctrl_socket, "ftp://host/dir", OK); | 636 ExecuteTransaction(&ctrl_socket, "ftp://host/dir", OK); |
637 } | 637 } |
638 | 638 |
639 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionVMSRootDirectory) { | 639 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionVMSRootDirectory) { |
640 FtpMockControlSocketVMSDirectoryListingRootDirectory ctrl_socket; | 640 FtpSocketDataProviderVMSDirectoryListingRootDirectory ctrl_socket; |
641 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); | 641 ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
642 } | 642 } |
643 | 643 |
644 TEST_F(FtpNetworkTransactionTest, DownloadTransaction) { | 644 TEST_F(FtpNetworkTransactionTest, DownloadTransaction) { |
645 FtpMockControlSocketFileDownload ctrl_socket; | 645 FtpSocketDataProviderFileDownload ctrl_socket; |
646 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); | 646 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
647 } | 647 } |
648 | 648 |
649 TEST_F(FtpNetworkTransactionTest, DownloadTransactionMultilineWelcome) { | 649 TEST_F(FtpNetworkTransactionTest, DownloadTransactionMultilineWelcome) { |
650 FtpMockControlSocketFileDownload ctrl_socket; | 650 FtpSocketDataProviderFileDownload ctrl_socket; |
651 ctrl_socket.set_multiline_welcome(true); | 651 ctrl_socket.set_multiline_welcome(true); |
652 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); | 652 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
653 } | 653 } |
654 | 654 |
655 TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads2) { | 655 TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads2) { |
656 FtpMockControlSocketFileDownload ctrl_socket; | 656 FtpSocketDataProviderFileDownload ctrl_socket; |
657 ctrl_socket.set_short_read_limit(2); | 657 ctrl_socket.set_short_read_limit(2); |
658 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); | 658 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
659 } | 659 } |
660 | 660 |
661 TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads5) { | 661 TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads5) { |
662 FtpMockControlSocketFileDownload ctrl_socket; | 662 FtpSocketDataProviderFileDownload ctrl_socket; |
663 ctrl_socket.set_short_read_limit(5); | 663 ctrl_socket.set_short_read_limit(5); |
664 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); | 664 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
665 } | 665 } |
666 | 666 |
667 TEST_F(FtpNetworkTransactionTest, DownloadTransactionVMS) { | 667 TEST_F(FtpNetworkTransactionTest, DownloadTransactionVMS) { |
668 FtpMockControlSocketVMSFileDownload ctrl_socket; | 668 FtpSocketDataProviderVMSFileDownload ctrl_socket; |
669 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); | 669 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
670 } | 670 } |
671 | 671 |
672 TEST_F(FtpNetworkTransactionTest, DownloadTransactionAcceptedDataConnection) { | 672 TEST_F(FtpNetworkTransactionTest, DownloadTransactionAcceptedDataConnection) { |
673 FtpMockControlSocketFileDownloadAcceptedDataConnection ctrl_socket; | 673 FtpSocketDataProviderFileDownloadAcceptedDataConnection ctrl_socket; |
674 std::string mock_data("mock-data"); | 674 std::string mock_data("mock-data"); |
675 MockRead data_reads[] = { | 675 MockRead data_reads[] = { |
676 MockRead(mock_data.c_str()), | 676 MockRead(mock_data.c_str()), |
677 }; | 677 }; |
678 StaticMockSocket data_socket1(data_reads, NULL); | 678 StaticSocketDataProvider data_socket1(data_reads, NULL); |
679 mock_socket_factory_.AddMockSocket(&ctrl_socket); | 679 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
680 mock_socket_factory_.AddMockSocket(&data_socket1); | 680 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
681 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 681 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
682 | 682 |
683 // Start the transaction. | 683 // Start the transaction. |
684 ASSERT_EQ(ERR_IO_PENDING, | 684 ASSERT_EQ(ERR_IO_PENDING, |
685 transaction_.Start(&request_info, &callback_, NULL)); | 685 transaction_.Start(&request_info, &callback_, NULL)); |
686 EXPECT_EQ(OK, callback_.WaitForResult()); | 686 EXPECT_EQ(OK, callback_.WaitForResult()); |
687 | 687 |
688 // The transaction fires the callback when we can start reading data. | 688 // The transaction fires the callback when we can start reading data. |
689 EXPECT_EQ(FtpMockControlSocket::PRE_QUIT, ctrl_socket.state()); | 689 EXPECT_EQ(FtpSocketDataProvider::PRE_QUIT, ctrl_socket.state()); |
690 EXPECT_EQ(LOAD_STATE_SENDING_REQUEST, transaction_.GetLoadState()); | 690 EXPECT_EQ(LOAD_STATE_SENDING_REQUEST, transaction_.GetLoadState()); |
691 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); | 691 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
692 memset(io_buffer->data(), 0, kBufferSize); | 692 memset(io_buffer->data(), 0, kBufferSize); |
693 ASSERT_EQ(ERR_IO_PENDING, | 693 ASSERT_EQ(ERR_IO_PENDING, |
694 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | 694 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); |
695 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); | 695 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); |
696 EXPECT_EQ(static_cast<int>(mock_data.length()), | 696 EXPECT_EQ(static_cast<int>(mock_data.length()), |
697 callback_.WaitForResult()); | 697 callback_.WaitForResult()); |
698 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); | 698 EXPECT_EQ(LOAD_STATE_READING_RESPONSE, transaction_.GetLoadState()); |
699 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); | 699 EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
700 | 700 |
701 // FTP server should disconnect the data socket. It is also a signal for the | 701 // FTP server should disconnect the data socket. It is also a signal for the |
702 // FtpNetworkTransaction that the data transfer is finished. | 702 // FtpNetworkTransaction that the data transfer is finished. |
703 ClientSocket* data_socket = mock_socket_factory_.GetMockTCPClientSocket(1); | 703 ClientSocket* data_socket = mock_socket_factory_.GetMockTCPClientSocket(1); |
704 ASSERT_TRUE(data_socket); | 704 ASSERT_TRUE(data_socket); |
705 data_socket->Disconnect(); | 705 data_socket->Disconnect(); |
706 | 706 |
707 // We should issue Reads until one returns EOF... | 707 // We should issue Reads until one returns EOF... |
708 ASSERT_EQ(ERR_IO_PENDING, | 708 ASSERT_EQ(ERR_IO_PENDING, |
709 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); | 709 transaction_.Read(io_buffer.get(), kBufferSize, &callback_)); |
710 | 710 |
711 // Make sure the transaction finishes cleanly. | 711 // Make sure the transaction finishes cleanly. |
712 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 712 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
713 EXPECT_EQ(OK, callback_.WaitForResult()); | 713 EXPECT_EQ(OK, callback_.WaitForResult()); |
714 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket.state()); | 714 EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket.state()); |
715 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); | 715 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
716 } | 716 } |
717 | 717 |
718 TEST_F(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { | 718 TEST_F(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { |
719 FtpMockControlSocketFileDownloadTransferStarting ctrl_socket; | 719 FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; |
720 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); | 720 ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
721 } | 721 } |
722 | 722 |
723 TEST_F(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { | 723 TEST_F(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { |
724 FtpMockControlSocketFileDownloadInvalidResponse ctrl_socket; | 724 FtpSocketDataProviderFileDownloadInvalidResponse ctrl_socket; |
725 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); | 725 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
726 } | 726 } |
727 | 727 |
728 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort1) { | 728 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort1) { |
729 FtpMockControlSocketEvilPasv ctrl_socket("227 Portscan (127,0,0,1,0,22)\r\n", | 729 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,0,22)\r\n", |
730 FtpMockControlSocket::PRE_QUIT); | 730 FtpSocketDataProvider::PRE_QUIT); |
731 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); | 731 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
732 } | 732 } |
733 | 733 |
734 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort2) { | 734 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort2) { |
735 // Still unsafe. 1 * 256 + 2 = 258, which is < 1024. | 735 // Still unsafe. 1 * 256 + 2 = 258, which is < 1024. |
736 FtpMockControlSocketEvilPasv ctrl_socket("227 Portscan (127,0,0,1,1,2)\r\n", | 736 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,1,2)\r\n", |
737 FtpMockControlSocket::PRE_QUIT); | 737 FtpSocketDataProvider::PRE_QUIT); |
738 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); | 738 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
739 } | 739 } |
740 | 740 |
741 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort3) { | 741 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort3) { |
742 // Still unsafe. 3 * 256 + 4 = 772, which is < 1024. | 742 // Still unsafe. 3 * 256 + 4 = 772, which is < 1024. |
743 FtpMockControlSocketEvilPasv ctrl_socket("227 Portscan (127,0,0,1,3,4)\r\n", | 743 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,3,4)\r\n", |
744 FtpMockControlSocket::PRE_QUIT); | 744 FtpSocketDataProvider::PRE_QUIT); |
745 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); | 745 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
746 } | 746 } |
747 | 747 |
748 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort4) { | 748 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort4) { |
749 // Unsafe. 8 * 256 + 1 = 2049, which is used by nfs. | 749 // Unsafe. 8 * 256 + 1 = 2049, which is used by nfs. |
750 FtpMockControlSocketEvilPasv ctrl_socket("227 Portscan (127,0,0,1,8,1)\r\n", | 750 FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,8,1)\r\n", |
751 FtpMockControlSocket::PRE_QUIT); | 751 FtpSocketDataProvider::PRE_QUIT); |
752 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); | 752 ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
753 } | 753 } |
754 | 754 |
755 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { | 755 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { |
756 FtpMockControlSocketEvilPasv ctrl_socket( | 756 FtpSocketDataProviderEvilPasv ctrl_socket( |
757 "227 Portscan (10,1,2,3,4,123,456)\r\n", FtpMockControlSocket::PRE_SIZE); | 757 "227 Portscan (10,1,2,3,4,123,456)\r\n", FtpSocketDataProvider::PRE_SIZE); |
758 std::string mock_data("mock-data"); | 758 std::string mock_data("mock-data"); |
759 MockRead data_reads[] = { | 759 MockRead data_reads[] = { |
760 MockRead(mock_data.c_str()), | 760 MockRead(mock_data.c_str()), |
761 }; | 761 }; |
762 StaticMockSocket data_socket1(data_reads, NULL); | 762 StaticSocketDataProvider data_socket1(data_reads, NULL); |
763 mock_socket_factory_.AddMockSocket(&ctrl_socket); | 763 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
764 mock_socket_factory_.AddMockSocket(&data_socket1); | 764 mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
765 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 765 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
766 | 766 |
767 // Start the transaction. | 767 // Start the transaction. |
768 ASSERT_EQ(ERR_IO_PENDING, | 768 ASSERT_EQ(ERR_IO_PENDING, |
769 transaction_.Start(&request_info, &callback_, NULL)); | 769 transaction_.Start(&request_info, &callback_, NULL)); |
770 EXPECT_EQ(OK, callback_.WaitForResult()); | 770 EXPECT_EQ(OK, callback_.WaitForResult()); |
771 | 771 |
772 // The transaction fires the callback when we can start reading data. That | 772 // The transaction fires the callback when we can start reading data. That |
773 // means that the data socket should be open. | 773 // means that the data socket should be open. |
774 MockTCPClientSocket* data_socket = | 774 MockTCPClientSocket* data_socket = |
775 mock_socket_factory_.GetMockTCPClientSocket(1); | 775 mock_socket_factory_.GetMockTCPClientSocket(1); |
776 ASSERT_TRUE(data_socket); | 776 ASSERT_TRUE(data_socket); |
777 ASSERT_TRUE(data_socket->IsConnected()); | 777 ASSERT_TRUE(data_socket->IsConnected()); |
778 | 778 |
779 // Even if the PASV response specified some other address, we connect | 779 // Even if the PASV response specified some other address, we connect |
780 // to the address we used for control connection. | 780 // to the address we used for control connection. |
781 EXPECT_EQ("127.0.0.1", NetAddressToString(data_socket->addresses().head())); | 781 EXPECT_EQ("127.0.0.1", NetAddressToString(data_socket->addresses().head())); |
782 | 782 |
783 // Make sure we have only one host entry in the AddressList. | 783 // Make sure we have only one host entry in the AddressList. |
784 EXPECT_FALSE(data_socket->addresses().head()->ai_next); | 784 EXPECT_FALSE(data_socket->addresses().head()->ai_next); |
785 } | 785 } |
786 | 786 |
787 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { | 787 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { |
788 FtpMockControlSocketEvilLogin ctrl_socket("hello%0Aworld", "test"); | 788 FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); |
789 ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); | 789 ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); |
790 } | 790 } |
791 | 791 |
792 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { | 792 TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { |
793 FtpMockControlSocketEvilLogin ctrl_socket("test", "hello%0Dworld"); | 793 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); |
794 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); | 794 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); |
795 } | 795 } |
796 | 796 |
797 TEST_F(FtpNetworkTransactionTest, DownloadTransactionSpaceInLogin) { | 797 TEST_F(FtpNetworkTransactionTest, DownloadTransactionSpaceInLogin) { |
798 FtpMockControlSocketEvilLogin ctrl_socket("hello world", "test"); | 798 FtpSocketDataProviderEvilLogin ctrl_socket("hello world", "test"); |
799 ExecuteTransaction(&ctrl_socket, "ftp://hello%20world:test@host/file", OK); | 799 ExecuteTransaction(&ctrl_socket, "ftp://hello%20world:test@host/file", OK); |
800 } | 800 } |
801 | 801 |
802 TEST_F(FtpNetworkTransactionTest, DownloadTransactionSpaceInPassword) { | 802 TEST_F(FtpNetworkTransactionTest, DownloadTransactionSpaceInPassword) { |
803 FtpMockControlSocketEvilLogin ctrl_socket("test", "hello world"); | 803 FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello world"); |
804 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%20world@host/file", OK); | 804 ExecuteTransaction(&ctrl_socket, "ftp://test:hello%20world@host/file", OK); |
805 } | 805 } |
806 | 806 |
807 TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { | 807 TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { |
808 FtpMockControlSocket ctrl_socket1; | 808 FtpSocketDataProvider ctrl_socket1; |
809 ctrl_socket1.InjectFailure(FtpMockControlSocket::PRE_PASSWD, | 809 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
810 FtpMockControlSocket::PRE_QUIT, | 810 FtpSocketDataProvider::PRE_QUIT, |
811 "530 Login authentication failed\r\n"); | 811 "530 Login authentication failed\r\n"); |
812 mock_socket_factory_.AddMockSocket(&ctrl_socket1); | 812 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
813 | 813 |
814 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 814 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
815 | 815 |
816 ASSERT_EQ(ERR_IO_PENDING, | 816 ASSERT_EQ(ERR_IO_PENDING, |
817 transaction_.Start(&request_info, &callback_, NULL)); | 817 transaction_.Start(&request_info, &callback_, NULL)); |
818 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); | 818 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); |
819 | 819 |
820 MockRead ctrl_reads[] = { | 820 MockRead ctrl_reads[] = { |
821 MockRead("220 host TestFTPd\r\n"), | 821 MockRead("220 host TestFTPd\r\n"), |
822 MockRead("221 Goodbye!\r\n"), | 822 MockRead("221 Goodbye!\r\n"), |
823 MockRead(false, OK), | 823 MockRead(false, OK), |
824 }; | 824 }; |
825 MockWrite ctrl_writes[] = { | 825 MockWrite ctrl_writes[] = { |
826 MockWrite("QUIT\r\n"), | 826 MockWrite("QUIT\r\n"), |
827 }; | 827 }; |
828 StaticMockSocket ctrl_socket2(ctrl_reads, ctrl_writes); | 828 StaticSocketDataProvider ctrl_socket2(ctrl_reads, ctrl_writes); |
829 mock_socket_factory_.AddMockSocket(&ctrl_socket2); | 829 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
830 ASSERT_EQ(ERR_IO_PENDING, transaction_.RestartWithAuth(L"foo\nownz0red", | 830 ASSERT_EQ(ERR_IO_PENDING, transaction_.RestartWithAuth(L"foo\nownz0red", |
831 L"innocent", | 831 L"innocent", |
832 &callback_)); | 832 &callback_)); |
833 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 833 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
834 } | 834 } |
835 | 835 |
836 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { | 836 TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { |
837 FtpMockControlSocket ctrl_socket1; | 837 FtpSocketDataProvider ctrl_socket1; |
838 ctrl_socket1.InjectFailure(FtpMockControlSocket::PRE_PASSWD, | 838 ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
839 FtpMockControlSocket::PRE_QUIT, | 839 FtpSocketDataProvider::PRE_QUIT, |
840 "530 Login authentication failed\r\n"); | 840 "530 Login authentication failed\r\n"); |
841 mock_socket_factory_.AddMockSocket(&ctrl_socket1); | 841 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
842 | 842 |
843 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); | 843 FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
844 | 844 |
845 ASSERT_EQ(ERR_IO_PENDING, | 845 ASSERT_EQ(ERR_IO_PENDING, |
846 transaction_.Start(&request_info, &callback_, NULL)); | 846 transaction_.Start(&request_info, &callback_, NULL)); |
847 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); | 847 EXPECT_EQ(ERR_FAILED, callback_.WaitForResult()); |
848 | 848 |
849 MockRead ctrl_reads[] = { | 849 MockRead ctrl_reads[] = { |
850 MockRead("220 host TestFTPd\r\n"), | 850 MockRead("220 host TestFTPd\r\n"), |
851 MockRead("331 User okay, send password\r\n"), | 851 MockRead("331 User okay, send password\r\n"), |
852 MockRead("221 Goodbye!\r\n"), | 852 MockRead("221 Goodbye!\r\n"), |
853 MockRead(false, OK), | 853 MockRead(false, OK), |
854 }; | 854 }; |
855 MockWrite ctrl_writes[] = { | 855 MockWrite ctrl_writes[] = { |
856 MockWrite("USER innocent\r\n"), | 856 MockWrite("USER innocent\r\n"), |
857 MockWrite("QUIT\r\n"), | 857 MockWrite("QUIT\r\n"), |
858 }; | 858 }; |
859 StaticMockSocket ctrl_socket2(ctrl_reads, ctrl_writes); | 859 StaticSocketDataProvider ctrl_socket2(ctrl_reads, ctrl_writes); |
860 mock_socket_factory_.AddMockSocket(&ctrl_socket2); | 860 mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
861 ASSERT_EQ(ERR_IO_PENDING, transaction_.RestartWithAuth(L"innocent", | 861 ASSERT_EQ(ERR_IO_PENDING, transaction_.RestartWithAuth(L"innocent", |
862 L"foo\nownz0red", | 862 L"foo\nownz0red", |
863 &callback_)); | 863 &callback_)); |
864 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); | 864 EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
865 } | 865 } |
866 | 866 |
867 TEST_F(FtpNetworkTransactionTest, Escaping) { | 867 TEST_F(FtpNetworkTransactionTest, Escaping) { |
868 FtpMockControlSocketEscaping ctrl_socket; | 868 FtpSocketDataProviderEscaping ctrl_socket; |
869 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", | 869 ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", |
870 OK); | 870 OK); |
871 } | 871 } |
872 | 872 |
873 // Regression test for http://crbug.com/25023. | 873 // Regression test for http://crbug.com/25023. |
874 TEST_F(FtpNetworkTransactionTest, CloseConnection) { | 874 TEST_F(FtpNetworkTransactionTest, CloseConnection) { |
875 FtpMockControlSocketCloseConnection ctrl_socket; | 875 FtpSocketDataProviderCloseConnection ctrl_socket; |
876 ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); | 876 ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); |
877 } | 877 } |
878 | 878 |
879 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { | 879 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { |
880 FtpMockControlSocketDirectoryListing ctrl_socket; | 880 FtpSocketDataProviderDirectoryListing ctrl_socket; |
881 TransactionFailHelper(&ctrl_socket, | 881 TransactionFailHelper(&ctrl_socket, |
882 "ftp://host", | 882 "ftp://host", |
883 FtpMockControlSocket::PRE_USER, | 883 FtpSocketDataProvider::PRE_USER, |
884 FtpMockControlSocket::PRE_QUIT, | 884 FtpSocketDataProvider::PRE_QUIT, |
885 "500 no such user\r\n", | 885 "500 no such user\r\n", |
886 ERR_FAILED); | 886 ERR_FAILED); |
887 } | 887 } |
888 | 888 |
889 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPass) { | 889 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPass) { |
890 FtpMockControlSocketDirectoryListing ctrl_socket; | 890 FtpSocketDataProviderDirectoryListing ctrl_socket; |
891 TransactionFailHelper(&ctrl_socket, | 891 TransactionFailHelper(&ctrl_socket, |
892 "ftp://host", | 892 "ftp://host", |
893 FtpMockControlSocket::PRE_PASSWD, | 893 FtpSocketDataProvider::PRE_PASSWD, |
894 FtpMockControlSocket::PRE_QUIT, | 894 FtpSocketDataProvider::PRE_QUIT, |
895 "530 Login authentication failed\r\n", | 895 "530 Login authentication failed\r\n", |
896 ERR_FAILED); | 896 ERR_FAILED); |
897 } | 897 } |
898 | 898 |
899 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailSyst) { | 899 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailSyst) { |
900 FtpMockControlSocketDirectoryListing ctrl_socket; | 900 FtpSocketDataProviderDirectoryListing ctrl_socket; |
901 TransactionFailHelper(&ctrl_socket, | 901 TransactionFailHelper(&ctrl_socket, |
902 "ftp://host", | 902 "ftp://host", |
903 FtpMockControlSocket::PRE_SYST, | 903 FtpSocketDataProvider::PRE_SYST, |
904 FtpMockControlSocket::PRE_PWD, | 904 FtpSocketDataProvider::PRE_PWD, |
905 "500 failed syst\r\n", | 905 "500 failed syst\r\n", |
906 OK); | 906 OK); |
907 } | 907 } |
908 | 908 |
909 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPwd) { | 909 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPwd) { |
910 FtpMockControlSocketDirectoryListing ctrl_socket; | 910 FtpSocketDataProviderDirectoryListing ctrl_socket; |
911 TransactionFailHelper(&ctrl_socket, | 911 TransactionFailHelper(&ctrl_socket, |
912 "ftp://host", | 912 "ftp://host", |
913 FtpMockControlSocket::PRE_PWD, | 913 FtpSocketDataProvider::PRE_PWD, |
914 FtpMockControlSocket::PRE_QUIT, | 914 FtpSocketDataProvider::PRE_QUIT, |
915 "500 failed pwd\r\n", | 915 "500 failed pwd\r\n", |
916 ERR_FAILED); | 916 ERR_FAILED); |
917 } | 917 } |
918 | 918 |
919 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailType) { | 919 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailType) { |
920 FtpMockControlSocketDirectoryListing ctrl_socket; | 920 FtpSocketDataProviderDirectoryListing ctrl_socket; |
921 TransactionFailHelper(&ctrl_socket, | 921 TransactionFailHelper(&ctrl_socket, |
922 "ftp://host", | 922 "ftp://host", |
923 FtpMockControlSocket::PRE_TYPE, | 923 FtpSocketDataProvider::PRE_TYPE, |
924 FtpMockControlSocket::PRE_QUIT, | 924 FtpSocketDataProvider::PRE_QUIT, |
925 "500 failed type\r\n", | 925 "500 failed type\r\n", |
926 ERR_FAILED); | 926 ERR_FAILED); |
927 } | 927 } |
928 | 928 |
929 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPasv) { | 929 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPasv) { |
930 FtpMockControlSocketDirectoryListing ctrl_socket; | 930 FtpSocketDataProviderDirectoryListing ctrl_socket; |
931 TransactionFailHelper(&ctrl_socket, | 931 TransactionFailHelper(&ctrl_socket, |
932 "ftp://host", | 932 "ftp://host", |
933 FtpMockControlSocket::PRE_PASV, | 933 FtpSocketDataProvider::PRE_PASV, |
934 FtpMockControlSocket::PRE_QUIT, | 934 FtpSocketDataProvider::PRE_QUIT, |
935 "500 failed pasv\r\n", | 935 "500 failed pasv\r\n", |
936 ERR_FAILED); | 936 ERR_FAILED); |
937 } | 937 } |
938 | 938 |
939 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMalformedMdtm) { | 939 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMalformedMdtm) { |
940 FtpMockControlSocketDirectoryListing ctrl_socket; | 940 FtpSocketDataProviderDirectoryListing ctrl_socket; |
941 TransactionFailHelper(&ctrl_socket, | 941 TransactionFailHelper(&ctrl_socket, |
942 "ftp://host", | 942 "ftp://host", |
943 FtpMockControlSocket::PRE_MDTM, | 943 FtpSocketDataProvider::PRE_MDTM, |
944 FtpMockControlSocket::PRE_RETR, | 944 FtpSocketDataProvider::PRE_RETR, |
945 "213 foobar\r\n", | 945 "213 foobar\r\n", |
946 OK); | 946 OK); |
947 } | 947 } |
948 | 948 |
949 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) { | 949 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) { |
950 FtpMockControlSocketDirectoryListing ctrl_socket; | 950 FtpSocketDataProviderDirectoryListing ctrl_socket; |
951 TransactionFailHelper(&ctrl_socket, | 951 TransactionFailHelper(&ctrl_socket, |
952 "ftp://host", | 952 "ftp://host", |
953 FtpMockControlSocket::PRE_MDTM, | 953 FtpSocketDataProvider::PRE_MDTM, |
954 FtpMockControlSocket::PRE_RETR, | 954 FtpSocketDataProvider::PRE_RETR, |
955 "500 failed mdtm\r\n", | 955 "500 failed mdtm\r\n", |
956 OK); | 956 OK); |
957 } | 957 } |
958 | 958 |
959 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPasv2) { | 959 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPasv2) { |
960 FtpMockControlSocketDirectoryListing ctrl_socket; | 960 FtpSocketDataProviderDirectoryListing ctrl_socket; |
961 TransactionFailHelper(&ctrl_socket, | 961 TransactionFailHelper(&ctrl_socket, |
962 "ftp://host", | 962 "ftp://host", |
963 FtpMockControlSocket::PRE_PASV2, | 963 FtpSocketDataProvider::PRE_PASV2, |
964 FtpMockControlSocket::PRE_QUIT, | 964 FtpSocketDataProvider::PRE_QUIT, |
965 "500 failed pasv2\r\n", | 965 "500 failed pasv2\r\n", |
966 ERR_FAILED); | 966 ERR_FAILED); |
967 } | 967 } |
968 | 968 |
969 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { | 969 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { |
970 FtpMockControlSocketDirectoryListing ctrl_socket; | 970 FtpSocketDataProviderDirectoryListing ctrl_socket; |
971 TransactionFailHelper(&ctrl_socket, | 971 TransactionFailHelper(&ctrl_socket, |
972 "ftp://host", | 972 "ftp://host", |
973 FtpMockControlSocket::PRE_CWD, | 973 FtpSocketDataProvider::PRE_CWD, |
974 FtpMockControlSocket::PRE_QUIT, | 974 FtpSocketDataProvider::PRE_QUIT, |
975 "500 failed cwd\r\n", | 975 "500 failed cwd\r\n", |
976 ERR_FAILED); | 976 ERR_FAILED); |
977 } | 977 } |
978 | 978 |
979 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFileNotFound) { | 979 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFileNotFound) { |
980 FtpMockControlSocketDirectoryListing ctrl_socket; | 980 FtpSocketDataProviderDirectoryListing ctrl_socket; |
981 TransactionFailHelper(&ctrl_socket, | 981 TransactionFailHelper(&ctrl_socket, |
982 "ftp://host", | 982 "ftp://host", |
983 FtpMockControlSocket::PRE_CWD, | 983 FtpSocketDataProvider::PRE_CWD, |
984 FtpMockControlSocket::PRE_QUIT, | 984 FtpSocketDataProvider::PRE_QUIT, |
985 "550 cannot open file\r\n", | 985 "550 cannot open file\r\n", |
986 ERR_FILE_NOT_FOUND); | 986 ERR_FILE_NOT_FOUND); |
987 } | 987 } |
988 | 988 |
989 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailList) { | 989 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailList) { |
990 FtpMockControlSocketDirectoryListing ctrl_socket; | 990 FtpSocketDataProviderDirectoryListing ctrl_socket; |
991 TransactionFailHelper(&ctrl_socket, | 991 TransactionFailHelper(&ctrl_socket, |
992 "ftp://host", | 992 "ftp://host", |
993 FtpMockControlSocket::PRE_LIST, | 993 FtpSocketDataProvider::PRE_LIST, |
994 FtpMockControlSocket::PRE_QUIT, | 994 FtpSocketDataProvider::PRE_QUIT, |
995 "500 failed list\r\n", | 995 "500 failed list\r\n", |
996 ERR_FAILED); | 996 ERR_FAILED); |
997 } | 997 } |
998 | 998 |
999 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailUser) { | 999 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailUser) { |
1000 FtpMockControlSocketFileDownload ctrl_socket; | 1000 FtpSocketDataProviderFileDownload ctrl_socket; |
1001 TransactionFailHelper(&ctrl_socket, | 1001 TransactionFailHelper(&ctrl_socket, |
1002 "ftp://host/file", | 1002 "ftp://host/file", |
1003 FtpMockControlSocket::PRE_USER, | 1003 FtpSocketDataProvider::PRE_USER, |
1004 FtpMockControlSocket::PRE_QUIT, | 1004 FtpSocketDataProvider::PRE_QUIT, |
1005 "500 no such user\r\n", | 1005 "500 no such user\r\n", |
1006 ERR_FAILED); | 1006 ERR_FAILED); |
1007 } | 1007 } |
1008 | 1008 |
1009 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailPass) { | 1009 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailPass) { |
1010 FtpMockControlSocketFileDownload ctrl_socket; | 1010 FtpSocketDataProviderFileDownload ctrl_socket; |
1011 TransactionFailHelper(&ctrl_socket, | 1011 TransactionFailHelper(&ctrl_socket, |
1012 "ftp://host/file", | 1012 "ftp://host/file", |
1013 FtpMockControlSocket::PRE_PASSWD, | 1013 FtpSocketDataProvider::PRE_PASSWD, |
1014 FtpMockControlSocket::PRE_QUIT, | 1014 FtpSocketDataProvider::PRE_QUIT, |
1015 "530 Login authentication failed\r\n", | 1015 "530 Login authentication failed\r\n", |
1016 ERR_FAILED); | 1016 ERR_FAILED); |
1017 } | 1017 } |
1018 | 1018 |
1019 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailSyst) { | 1019 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailSyst) { |
1020 FtpMockControlSocketFileDownload ctrl_socket; | 1020 FtpSocketDataProviderFileDownload ctrl_socket; |
1021 TransactionFailHelper(&ctrl_socket, | 1021 TransactionFailHelper(&ctrl_socket, |
1022 "ftp://host/file", | 1022 "ftp://host/file", |
1023 FtpMockControlSocket::PRE_SYST, | 1023 FtpSocketDataProvider::PRE_SYST, |
1024 FtpMockControlSocket::PRE_PWD, | 1024 FtpSocketDataProvider::PRE_PWD, |
1025 "500 failed syst\r\n", | 1025 "500 failed syst\r\n", |
1026 OK); | 1026 OK); |
1027 } | 1027 } |
1028 | 1028 |
1029 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailPwd) { | 1029 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailPwd) { |
1030 FtpMockControlSocketFileDownload ctrl_socket; | 1030 FtpSocketDataProviderFileDownload ctrl_socket; |
1031 TransactionFailHelper(&ctrl_socket, | 1031 TransactionFailHelper(&ctrl_socket, |
1032 "ftp://host/file", | 1032 "ftp://host/file", |
1033 FtpMockControlSocket::PRE_PWD, | 1033 FtpSocketDataProvider::PRE_PWD, |
1034 FtpMockControlSocket::PRE_QUIT, | 1034 FtpSocketDataProvider::PRE_QUIT, |
1035 "500 failed pwd\r\n", | 1035 "500 failed pwd\r\n", |
1036 ERR_FAILED); | 1036 ERR_FAILED); |
1037 } | 1037 } |
1038 | 1038 |
1039 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailType) { | 1039 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailType) { |
1040 FtpMockControlSocketFileDownload ctrl_socket; | 1040 FtpSocketDataProviderFileDownload ctrl_socket; |
1041 TransactionFailHelper(&ctrl_socket, | 1041 TransactionFailHelper(&ctrl_socket, |
1042 "ftp://host/file", | 1042 "ftp://host/file", |
1043 FtpMockControlSocket::PRE_TYPE, | 1043 FtpSocketDataProvider::PRE_TYPE, |
1044 FtpMockControlSocket::PRE_QUIT, | 1044 FtpSocketDataProvider::PRE_QUIT, |
1045 "500 failed type\r\n", | 1045 "500 failed type\r\n", |
1046 ERR_FAILED); | 1046 ERR_FAILED); |
1047 } | 1047 } |
1048 | 1048 |
1049 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailPasv) { | 1049 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailPasv) { |
1050 FtpMockControlSocketFileDownload ctrl_socket; | 1050 FtpSocketDataProviderFileDownload ctrl_socket; |
1051 TransactionFailHelper(&ctrl_socket, | 1051 TransactionFailHelper(&ctrl_socket, |
1052 "ftp://host/file", | 1052 "ftp://host/file", |
1053 FtpMockControlSocket::PRE_PASV, | 1053 FtpSocketDataProvider::PRE_PASV, |
1054 FtpMockControlSocket::PRE_QUIT, | 1054 FtpSocketDataProvider::PRE_QUIT, |
1055 "500 failed pasv\r\n", | 1055 "500 failed pasv\r\n", |
1056 ERR_FAILED); | 1056 ERR_FAILED); |
1057 } | 1057 } |
1058 | 1058 |
1059 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailMdtm) { | 1059 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailMdtm) { |
1060 FtpMockControlSocketFileDownload ctrl_socket; | 1060 FtpSocketDataProviderFileDownload ctrl_socket; |
1061 TransactionFailHelper(&ctrl_socket, | 1061 TransactionFailHelper(&ctrl_socket, |
1062 "ftp://host/file", | 1062 "ftp://host/file", |
1063 FtpMockControlSocket::PRE_MDTM, | 1063 FtpSocketDataProvider::PRE_MDTM, |
1064 FtpMockControlSocket::PRE_RETR, | 1064 FtpSocketDataProvider::PRE_RETR, |
1065 "500 failed mdtm\r\n", | 1065 "500 failed mdtm\r\n", |
1066 OK); | 1066 OK); |
1067 } | 1067 } |
1068 | 1068 |
1069 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { | 1069 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { |
1070 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; | 1070 FtpSocketDataProviderFileDownloadRetrFail ctrl_socket; |
1071 TransactionFailHelper(&ctrl_socket, | 1071 TransactionFailHelper(&ctrl_socket, |
1072 "ftp://host/file", | 1072 "ftp://host/file", |
1073 FtpMockControlSocket::PRE_RETR, | 1073 FtpSocketDataProvider::PRE_RETR, |
1074 FtpMockControlSocket::PRE_QUIT, | 1074 FtpSocketDataProvider::PRE_QUIT, |
1075 "500 failed retr\r\n", | 1075 "500 failed retr\r\n", |
1076 ERR_FAILED); | 1076 ERR_FAILED); |
1077 } | 1077 } |
1078 | 1078 |
1079 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { | 1079 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { |
1080 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; | 1080 FtpSocketDataProviderFileDownloadRetrFail ctrl_socket; |
1081 TransactionFailHelper(&ctrl_socket, | 1081 TransactionFailHelper(&ctrl_socket, |
1082 "ftp://host/file", | 1082 "ftp://host/file", |
1083 FtpMockControlSocket::PRE_RETR, | 1083 FtpSocketDataProvider::PRE_RETR, |
1084 FtpMockControlSocket::PRE_PASV2, | 1084 FtpSocketDataProvider::PRE_PASV2, |
1085 "550 cannot open file\r\n", | 1085 "550 cannot open file\r\n", |
1086 ERR_FILE_NOT_FOUND); | 1086 ERR_FILE_NOT_FOUND); |
1087 } | 1087 } |
1088 | 1088 |
1089 } // namespace net | 1089 } // namespace net |
OLD | NEW |