Index: net/ftp/ftp_network_transaction_unittest.cc |
diff --git a/net/ftp/ftp_network_transaction_unittest.cc b/net/ftp/ftp_network_transaction_unittest.cc |
index 9c9f62e0c969325dd3c71da1454e629c16e347d1..1c22c5b2f28f9f796f9e990b4c157168d83d6857 100644 |
--- a/net/ftp/ftp_network_transaction_unittest.cc |
+++ b/net/ftp/ftp_network_transaction_unittest.cc |
@@ -331,6 +331,30 @@ class FtpSocketDataProviderVMSDirectoryListingRootDirectory |
FtpSocketDataProviderVMSDirectoryListingRootDirectory); |
}; |
+class FtpSocketDataProviderFileDownloadWithFileTypecode |
+ : public FtpSocketDataProvider { |
+ public: |
+ FtpSocketDataProviderFileDownloadWithFileTypecode() { |
+ } |
+ |
+ virtual MockWriteResult OnWrite(const std::string& data) { |
+ if (InjectFault()) |
+ return MockWriteResult(true, data.length()); |
+ switch (state()) { |
+ case PRE_SIZE: |
+ return Verify("SIZE /file\r\n", data, PRE_RETR, |
+ "213 18\r\n"); |
+ case PRE_RETR: |
+ return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); |
+ default: |
+ return FtpSocketDataProvider::OnWrite(data); |
+ } |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithFileTypecode); |
+}; |
+ |
class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { |
public: |
FtpSocketDataProviderFileDownload() { |
@@ -341,8 +365,11 @@ class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { |
return MockWriteResult(true, data.length()); |
switch (state()) { |
case PRE_SIZE: |
- return Verify("SIZE /file\r\n", data, PRE_RETR, |
+ return Verify("SIZE /file\r\n", data, PRE_CWD, |
"213 18\r\n"); |
+ case PRE_CWD: |
+ return Verify("CWD /file\r\n", data, PRE_RETR, |
+ "550 Not a directory\r\n"); |
case PRE_RETR: |
return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); |
default: |
@@ -452,8 +479,11 @@ class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { |
return Verify("PASV\r\n", data, PRE_SIZE, |
"227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
case PRE_SIZE: |
- return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_RETR, |
+ return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_CWD, |
"213 18\r\n"); |
+ case PRE_CWD: |
+ return Verify("CWD ANONYMOUS_ROOT:[file]\r\n", data, PRE_RETR, |
+ "550 Not a directory\r\n"); |
case PRE_RETR: |
return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, |
"200 OK\r\n"); |
@@ -476,8 +506,11 @@ class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload { |
return MockWriteResult(true, data.length()); |
switch (state()) { |
case PRE_SIZE: |
- return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_RETR, |
+ return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_CWD, |
"213 18\r\n"); |
+ case PRE_CWD: |
+ return Verify("CWD / !\"#$%y\200\201\r\n", data, PRE_RETR, |
+ "550 Not a directory\r\n"); |
case PRE_RETR: |
return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, |
"200 OK\r\n"); |
@@ -891,7 +924,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithPasvFallback) { |
} |
TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
+ FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; |
ctrl_socket.set_data_type('A'); |
ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=a", OK); |
@@ -900,7 +933,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { |
} |
TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeI) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
+ FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; |
ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=i", OK); |
// We pass an artificial value of 18 as a response to the SIZE command. |
@@ -1191,7 +1224,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionBigSize) { |
// Pass a valid, but large file size. The transaction should not fail. |
FtpSocketDataProviderEvilSize ctrl_socket( |
"213 3204427776\r\n", |
- FtpSocketDataProvider::PRE_RETR); |
+ FtpSocketDataProvider::PRE_CWD); |
ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
EXPECT_EQ(3204427776LL, |
transaction_.GetResponseInfo()->expected_content_size); |