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

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

Issue 293049: Fix compatibility problems with FileZilla FTP Server. (Closed)
Patch Set: Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/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 29 matching lines...) Expand all
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_CWD, 51 PRE_CWD,
51 PRE_QUIT, 52 PRE_QUIT,
52 QUIT 53 QUIT
53 }; 54 };
54 55
55 FtpMockControlSocket() 56 FtpMockControlSocket()
56 : failure_injection_state_(NONE), 57 : failure_injection_state_(NONE),
57 multiline_welcome_(false) { 58 multiline_welcome_(false) {
58 Init(); 59 Init();
59 } 60 }
(...skipping 16 matching lines...) Expand all
76 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");
77 case PRE_PWD: 78 case PRE_PWD:
78 return Verify("PWD\r\n", data, PRE_TYPE, 79 return Verify("PWD\r\n", data, PRE_TYPE,
79 "257 \"/\" is your current location\r\n"); 80 "257 \"/\" is your current location\r\n");
80 case PRE_TYPE: 81 case PRE_TYPE:
81 return Verify("TYPE I\r\n", data, PRE_PASV, 82 return Verify("TYPE I\r\n", data, PRE_PASV,
82 "200 TYPE is now 8-bit binary\r\n"); 83 "200 TYPE is now 8-bit binary\r\n");
83 case PRE_PASV: 84 case PRE_PASV:
84 return Verify("PASV\r\n", data, PRE_SIZE, 85 return Verify("PASV\r\n", data, PRE_SIZE,
85 "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:
88 // Parser should also accept format without parentheses.
89 return Verify("PASV\r\n", data, PRE_CWD,
90 "227 Entering Passive Mode 127,0,0,1,123,456\r\n");
86 case PRE_QUIT: 91 case PRE_QUIT:
87 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); 92 return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n");
88 default: 93 default:
94 NOTREACHED() << "State not handled " << state();
89 return MockWriteResult(true, ERR_UNEXPECTED); 95 return MockWriteResult(true, ERR_UNEXPECTED);
90 } 96 }
91 } 97 }
92 98
93 void InjectFailure(State state, State next_state, const char* response) { 99 void InjectFailure(State state, State next_state, const char* response) {
94 DCHECK_EQ(NONE, failure_injection_state_); 100 DCHECK_EQ(NONE, failure_injection_state_);
95 DCHECK_NE(NONE, state); 101 DCHECK_NE(NONE, state);
96 DCHECK_NE(NONE, next_state); 102 DCHECK_NE(NONE, next_state);
97 DCHECK_NE(state, next_state); 103 DCHECK_NE(state, next_state);
98 failure_injection_state_ = state; 104 failure_injection_state_ = state;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 if (InjectFault()) 169 if (InjectFault())
164 return MockWriteResult(true, data.length()); 170 return MockWriteResult(true, data.length());
165 switch (state()) { 171 switch (state()) {
166 case PRE_SIZE: 172 case PRE_SIZE:
167 return Verify("SIZE /\r\n", data, PRE_MDTM, 173 return Verify("SIZE /\r\n", data, PRE_MDTM,
168 "550 I can only retrieve regular files\r\n"); 174 "550 I can only retrieve regular files\r\n");
169 case PRE_MDTM: 175 case PRE_MDTM:
170 return Verify("MDTM /\r\n", data, PRE_RETR, 176 return Verify("MDTM /\r\n", data, PRE_RETR,
171 "213 20070221112533\r\n"); 177 "213 20070221112533\r\n");
172 case PRE_RETR: 178 case PRE_RETR:
173 return Verify("RETR /\r\n", data, PRE_CWD, 179 return Verify("RETR /\r\n", data, PRE_PASV2,
174 "550 Can't download directory\r\n"); 180 "550 Can't download directory\r\n");
181
175 case PRE_CWD: 182 case PRE_CWD:
176 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");
177 case PRE_LIST: 184 case PRE_LIST:
178 // TODO(phajdan.jr): Also test with "150 Accepted Data Connection". 185 // TODO(phajdan.jr): Also test with "150 Accepted Data Connection".
179 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");
180 default: 187 default:
181 return FtpMockControlSocket::OnWrite(data); 188 return FtpMockControlSocket::OnWrite(data);
182 } 189 }
183 } 190 }
184 191
(...skipping 15 matching lines...) Expand all
200 case PRE_PWD: 207 case PRE_PWD:
201 return Verify("PWD\r\n", data, PRE_TYPE, 208 return Verify("PWD\r\n", data, PRE_TYPE,
202 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); 209 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n");
203 case PRE_SIZE: 210 case PRE_SIZE:
204 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,
205 "550 I can only retrieve regular files\r\n"); 212 "550 I can only retrieve regular files\r\n");
206 case PRE_MDTM: 213 case PRE_MDTM:
207 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,
208 "213 20070221112533\r\n"); 215 "213 20070221112533\r\n");
209 case PRE_RETR: 216 case PRE_RETR:
210 return Verify("RETR ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD, 217 return Verify("RETR ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_PASV2,
211 "550 Can't download directory\r\n"); 218 "550 Can't download directory\r\n");
212 case PRE_CWD: 219 case PRE_CWD:
213 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, 220 return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST,
214 "200 OK\r\n"); 221 "200 OK\r\n");
215 case PRE_LIST: 222 case PRE_LIST:
216 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");
217 default: 224 default:
218 return FtpMockControlSocket::OnWrite(data); 225 return FtpMockControlSocket::OnWrite(data);
219 } 226 }
220 } 227 }
(...skipping 17 matching lines...) Expand all
238 case PRE_PWD: 245 case PRE_PWD:
239 return Verify("PWD\r\n", data, PRE_TYPE, 246 return Verify("PWD\r\n", data, PRE_TYPE,
240 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); 247 "257 \"ANONYMOUS_ROOT:[000000]\"\r\n");
241 case PRE_SIZE: 248 case PRE_SIZE:
242 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_MDTM, 249 return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_MDTM,
243 "550 I can only retrieve regular files\r\n"); 250 "550 I can only retrieve regular files\r\n");
244 case PRE_MDTM: 251 case PRE_MDTM:
245 return Verify("MDTM ANONYMOUS_ROOT\r\n", data, PRE_RETR, 252 return Verify("MDTM ANONYMOUS_ROOT\r\n", data, PRE_RETR,
246 "213 20070221112533\r\n"); 253 "213 20070221112533\r\n");
247 case PRE_RETR: 254 case PRE_RETR:
248 return Verify("RETR ANONYMOUS_ROOT\r\n", data, PRE_CWD, 255 return Verify("RETR ANONYMOUS_ROOT\r\n", data, PRE_PASV2,
249 "550 Can't download directory\r\n"); 256 "550 Can't download directory\r\n");
250 case PRE_CWD: 257 case PRE_CWD:
251 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, 258 return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST,
252 "200 OK\r\n"); 259 "200 OK\r\n");
253 case PRE_LIST: 260 case PRE_LIST:
254 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");
255 default: 262 default:
256 return FtpMockControlSocket::OnWrite(data); 263 return FtpMockControlSocket::OnWrite(data);
257 } 264 }
258 } 265 }
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 return info; 517 return info;
511 } 518 }
512 519
513 void ExecuteTransaction(FtpMockControlSocket* ctrl_socket, 520 void ExecuteTransaction(FtpMockControlSocket* ctrl_socket,
514 const char* request, 521 const char* request,
515 int expected_result) { 522 int expected_result) {
516 std::string mock_data("mock-data"); 523 std::string mock_data("mock-data");
517 MockRead data_reads[] = { 524 MockRead data_reads[] = {
518 MockRead(mock_data.c_str()), 525 MockRead(mock_data.c_str()),
519 }; 526 };
520 StaticMockSocket data_socket(data_reads, NULL); 527 // For compatibility with FileZilla, the transaction code will use two data
528 // socket for directory requests. For more info see http://crbug.com/25316.
eroman 2009/10/21 16:57:52 nit: socket --> sockets
529 StaticMockSocket data_socket1(data_reads, NULL);
530 StaticMockSocket data_socket2(data_reads, NULL);
521 mock_socket_factory_.AddMockSocket(ctrl_socket); 531 mock_socket_factory_.AddMockSocket(ctrl_socket);
522 mock_socket_factory_.AddMockSocket(&data_socket); 532 mock_socket_factory_.AddMockSocket(&data_socket1);
533 mock_socket_factory_.AddMockSocket(&data_socket2);
523 FtpRequestInfo request_info = GetRequestInfo(request); 534 FtpRequestInfo request_info = GetRequestInfo(request);
524 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); 535 EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState());
525 ASSERT_EQ(ERR_IO_PENDING, 536 ASSERT_EQ(ERR_IO_PENDING,
526 transaction_.Start(&request_info, &callback_, NULL)); 537 transaction_.Start(&request_info, &callback_, NULL));
527 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); 538 EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState());
528 EXPECT_EQ(expected_result, callback_.WaitForResult()); 539 EXPECT_EQ(expected_result, callback_.WaitForResult());
529 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state()); 540 EXPECT_EQ(FtpMockControlSocket::QUIT, ctrl_socket->state());
530 if (expected_result == OK) { 541 if (expected_result == OK) {
531 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); 542 scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize));
532 memset(io_buffer->data(), 0, kBufferSize); 543 memset(io_buffer->data(), 0, kBufferSize);
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
911 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) { 922 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailMdtm) {
912 FtpMockControlSocketDirectoryListing ctrl_socket; 923 FtpMockControlSocketDirectoryListing ctrl_socket;
913 TransactionFailHelper(&ctrl_socket, 924 TransactionFailHelper(&ctrl_socket,
914 "ftp://host", 925 "ftp://host",
915 FtpMockControlSocket::PRE_MDTM, 926 FtpMockControlSocket::PRE_MDTM,
916 FtpMockControlSocket::PRE_RETR, 927 FtpMockControlSocket::PRE_RETR,
917 "500 failed mdtm\r\n", 928 "500 failed mdtm\r\n",
918 OK); 929 OK);
919 } 930 }
920 931
932 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailPasv2) {
933 FtpMockControlSocketDirectoryListing ctrl_socket;
934 TransactionFailHelper(&ctrl_socket,
935 "ftp://host",
936 FtpMockControlSocket::PRE_PASV2,
937 FtpMockControlSocket::PRE_QUIT,
938 "500 failed pasv2\r\n",
939 ERR_FAILED);
940 }
941
921 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { 942 TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) {
922 FtpMockControlSocketDirectoryListing ctrl_socket; 943 FtpMockControlSocketDirectoryListing ctrl_socket;
923 TransactionFailHelper(&ctrl_socket, 944 TransactionFailHelper(&ctrl_socket,
924 "ftp://host", 945 "ftp://host",
925 FtpMockControlSocket::PRE_CWD, 946 FtpMockControlSocket::PRE_CWD,
926 FtpMockControlSocket::PRE_QUIT, 947 FtpMockControlSocket::PRE_QUIT,
927 "500 failed cwd\r\n", 948 "500 failed cwd\r\n",
928 ERR_FAILED); 949 ERR_FAILED);
929 } 950 }
930 951
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 FtpMockControlSocket::PRE_QUIT, 1047 FtpMockControlSocket::PRE_QUIT,
1027 "500 failed retr\r\n", 1048 "500 failed retr\r\n",
1028 ERR_FAILED); 1049 ERR_FAILED);
1029 } 1050 }
1030 1051
1031 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) { 1052 TEST_F(FtpNetworkTransactionTest, DownloadTransactionFileNotFound) {
1032 FtpMockControlSocketFileDownloadRetrFail ctrl_socket; 1053 FtpMockControlSocketFileDownloadRetrFail ctrl_socket;
1033 TransactionFailHelper(&ctrl_socket, 1054 TransactionFailHelper(&ctrl_socket,
1034 "ftp://host/file", 1055 "ftp://host/file",
1035 FtpMockControlSocket::PRE_RETR, 1056 FtpMockControlSocket::PRE_RETR,
1036 FtpMockControlSocket::PRE_CWD, 1057 FtpMockControlSocket::PRE_PASV2,
1037 "550 cannot open file\r\n", 1058 "550 cannot open file\r\n",
1038 ERR_FILE_NOT_FOUND); 1059 ERR_FILE_NOT_FOUND);
1039 } 1060 }
1040 1061
1041 } // namespace net 1062 } // namespace net
OLDNEW
« net/ftp/ftp_network_transaction.cc ('K') | « net/ftp/ftp_network_transaction.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698