| 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 |