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 |
deleted file mode 100644 |
index 79e16877bdd19d4ddd214cd66c288a1b415c46e0..0000000000000000000000000000000000000000 |
--- a/net/ftp/ftp_network_transaction_unittest.cc |
+++ /dev/null |
@@ -1,1579 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/ftp/ftp_network_transaction.h" |
- |
-#include "build/build_config.h" |
- |
-#include "base/compiler_specific.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_vector.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "net/base/host_port_pair.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/net_util.h" |
-#include "net/base/test_completion_callback.h" |
-#include "net/dns/mock_host_resolver.h" |
-#include "net/ftp/ftp_network_session.h" |
-#include "net/ftp/ftp_request_info.h" |
-#include "net/socket/socket_test_util.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "testing/platform_test.h" |
- |
-namespace { |
- |
-// Size we use for IOBuffers used to receive data from the test data socket. |
-const int kBufferSize = 128; |
- |
-} // namespace |
- |
-namespace net { |
- |
-class FtpSocketDataProvider : public DynamicSocketDataProvider { |
- public: |
- enum State { |
- NONE, |
- PRE_USER, |
- PRE_PASSWD, |
- PRE_SYST, |
- PRE_PWD, |
- PRE_TYPE, |
- PRE_SIZE, |
- PRE_LIST_EPSV, |
- PRE_LIST_PASV, |
- PRE_LIST, |
- PRE_RETR, |
- PRE_RETR_EPSV, |
- PRE_RETR_PASV, |
- PRE_CWD, |
- PRE_QUIT, |
- PRE_NOPASV, |
- QUIT |
- }; |
- |
- FtpSocketDataProvider() |
- : failure_injection_state_(NONE), |
- multiline_welcome_(false), |
- use_epsv_(true), |
- data_type_('I') { |
- Init(); |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_USER: |
- return Verify("USER anonymous\r\n", data, PRE_PASSWD, |
- "331 Password needed\r\n"); |
- case PRE_PASSWD: |
- { |
- static const char response_one[] = "230 Welcome\r\n"; |
- static const char response_multi[] = |
- "230- One\r\n230- Two\r\n230 Three\r\n"; |
- return Verify("PASS chrome@example.com\r\n", data, PRE_SYST, |
- multiline_welcome_ ? response_multi : response_one); |
- } |
- case PRE_SYST: |
- return Verify("SYST\r\n", data, PRE_PWD, "215 UNIX\r\n"); |
- case PRE_PWD: |
- return Verify("PWD\r\n", data, PRE_TYPE, |
- "257 \"/\" is your current location\r\n"); |
- case PRE_TYPE: |
- return Verify(std::string("TYPE ") + data_type_ + "\r\n", data, |
- PRE_SIZE, "200 TYPE set successfully\r\n"); |
- case PRE_LIST_EPSV: |
- return Verify("EPSV\r\n", data, PRE_LIST, |
- "227 Entering Extended Passive Mode (|||31744|)\r\n"); |
- case PRE_LIST_PASV: |
- return Verify("PASV\r\n", data, PRE_LIST, |
- "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
- case PRE_RETR_EPSV: |
- return Verify("EPSV\r\n", data, PRE_RETR, |
- "227 Entering Extended Passive Mode (|||31744|)\r\n"); |
- case PRE_RETR_PASV: |
- return Verify("PASV\r\n", data, PRE_RETR, |
- "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); |
- case PRE_NOPASV: |
- // Use unallocated 599 FTP error code to make sure it falls into the |
- // generic ERR_FTP_FAILED bucket. |
- return Verify("PASV\r\n", data, PRE_QUIT, |
- "599 fail\r\n"); |
- case PRE_QUIT: |
- return Verify("QUIT\r\n", data, QUIT, "221 Goodbye.\r\n"); |
- default: |
- NOTREACHED() << "State not handled " << state(); |
- return MockWriteResult(ASYNC, ERR_UNEXPECTED); |
- } |
- } |
- |
- void InjectFailure(State state, State next_state, const char* response) { |
- DCHECK_EQ(NONE, failure_injection_state_); |
- DCHECK_NE(NONE, state); |
- DCHECK_NE(NONE, next_state); |
- DCHECK_NE(state, next_state); |
- failure_injection_state_ = state; |
- failure_injection_next_state_ = next_state; |
- fault_response_ = response; |
- } |
- |
- State state() const { |
- return state_; |
- } |
- |
- void Reset() override { |
- DynamicSocketDataProvider::Reset(); |
- Init(); |
- } |
- |
- void set_multiline_welcome(bool multiline) { multiline_welcome_ = multiline; } |
- |
- bool use_epsv() const { return use_epsv_; } |
- void set_use_epsv(bool use_epsv) { use_epsv_ = use_epsv; } |
- |
- void set_data_type(char data_type) { data_type_ = data_type; } |
- |
- protected: |
- void Init() { |
- state_ = PRE_USER; |
- SimulateRead("220 host TestFTPd\r\n"); |
- } |
- |
- // If protocol fault injection has been requested, adjusts state and mocked |
- // read and returns true. |
- bool InjectFault() { |
- if (state_ != failure_injection_state_) |
- return false; |
- SimulateRead(fault_response_); |
- state_ = failure_injection_next_state_; |
- return true; |
- } |
- |
- MockWriteResult Verify(const std::string& expected, |
- const std::string& data, |
- State next_state, |
- const char* next_read, |
- const size_t next_read_length) { |
- EXPECT_EQ(expected, data); |
- if (expected == data) { |
- state_ = next_state; |
- SimulateRead(next_read, next_read_length); |
- return MockWriteResult(ASYNC, data.length()); |
- } |
- return MockWriteResult(ASYNC, ERR_UNEXPECTED); |
- } |
- |
- MockWriteResult Verify(const std::string& expected, |
- const std::string& data, |
- State next_state, |
- const char* next_read) { |
- return Verify(expected, data, next_state, |
- next_read, std::strlen(next_read)); |
- } |
- |
- |
- private: |
- State state_; |
- State failure_injection_state_; |
- State failure_injection_next_state_; |
- const char* fault_response_; |
- |
- // If true, we will send multiple 230 lines as response after PASS. |
- bool multiline_welcome_; |
- |
- // If true, we will use EPSV command. |
- bool use_epsv_; |
- |
- // Data type to be used for TYPE command. |
- char data_type_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProvider); |
-}; |
- |
-class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { |
- public: |
- FtpSocketDataProviderDirectoryListing() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- return Verify("SIZE /\r\n", data, PRE_CWD, |
- "550 I can only retrieve regular files\r\n"); |
- case PRE_CWD: |
- return Verify("CWD /\r\n", data, |
- use_epsv() ? PRE_LIST_EPSV : PRE_LIST_PASV, "200 OK\r\n"); |
- case PRE_LIST: |
- return Verify("LIST -l\r\n", data, PRE_QUIT, "200 OK\r\n"); |
- default: |
- return FtpSocketDataProvider::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListing); |
-}; |
- |
-class FtpSocketDataProviderDirectoryListingWithPasvFallback |
- : public FtpSocketDataProviderDirectoryListing { |
- public: |
- FtpSocketDataProviderDirectoryListingWithPasvFallback() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_LIST_EPSV: |
- return Verify("EPSV\r\n", data, PRE_LIST_PASV, |
- "500 no EPSV for you\r\n"); |
- case PRE_SIZE: |
- return Verify("SIZE /\r\n", data, PRE_CWD, |
- "550 I can only retrieve regular files\r\n"); |
- default: |
- return FtpSocketDataProviderDirectoryListing::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN( |
- FtpSocketDataProviderDirectoryListingWithPasvFallback); |
-}; |
- |
-class FtpSocketDataProviderDirectoryListingZeroSize |
- : public FtpSocketDataProviderDirectoryListing { |
- public: |
- FtpSocketDataProviderDirectoryListingZeroSize() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- return Verify("SIZE /\r\n", data, PRE_CWD, "213 0\r\n"); |
- default: |
- return FtpSocketDataProviderDirectoryListing::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderDirectoryListingZeroSize); |
-}; |
- |
-class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { |
- public: |
- FtpSocketDataProviderVMSDirectoryListing() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SYST: |
- return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
- case PRE_PWD: |
- return Verify("PWD\r\n", data, PRE_TYPE, |
- "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
- case PRE_LIST_EPSV: |
- return Verify("EPSV\r\n", data, PRE_LIST_PASV, |
- "500 Invalid command\r\n"); |
- case PRE_SIZE: |
- return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD, |
- "550 I can only retrieve regular files\r\n"); |
- case PRE_CWD: |
- return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, |
- use_epsv() ? PRE_LIST_EPSV : PRE_LIST_PASV, "200 OK\r\n"); |
- case PRE_LIST: |
- return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
- default: |
- return FtpSocketDataProvider::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSDirectoryListing); |
-}; |
- |
-class FtpSocketDataProviderVMSDirectoryListingRootDirectory |
- : public FtpSocketDataProvider { |
- public: |
- FtpSocketDataProviderVMSDirectoryListingRootDirectory() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SYST: |
- return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
- case PRE_PWD: |
- return Verify("PWD\r\n", data, PRE_TYPE, |
- "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
- case PRE_LIST_EPSV: |
- return Verify("EPSV\r\n", data, PRE_LIST_PASV, |
- "500 EPSV command unknown\r\n"); |
- case PRE_SIZE: |
- return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD, |
- "550 I can only retrieve regular files\r\n"); |
- case PRE_CWD: |
- return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, |
- use_epsv() ? PRE_LIST_EPSV : PRE_LIST_PASV, "200 OK\r\n"); |
- case PRE_LIST: |
- return Verify("LIST *.*;0\r\n", data, PRE_QUIT, "200 OK\r\n"); |
- default: |
- return FtpSocketDataProvider::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN( |
- FtpSocketDataProviderVMSDirectoryListingRootDirectory); |
-}; |
- |
-class FtpSocketDataProviderFileDownloadWithFileTypecode |
- : public FtpSocketDataProvider { |
- public: |
- FtpSocketDataProviderFileDownloadWithFileTypecode() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- return Verify("SIZE /file\r\n", data, |
- use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, "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() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- return Verify("SIZE /file\r\n", data, PRE_CWD, "213 18\r\n"); |
- case PRE_CWD: |
- return Verify("CWD /file\r\n", data, |
- use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
- "550 Not a directory\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(FtpSocketDataProviderFileDownload); |
-}; |
- |
-class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider { |
- public: |
- FtpSocketDataProviderFileNotFound() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- return Verify("SIZE /file\r\n", data, PRE_CWD, |
- "550 File Not Found\r\n"); |
- case PRE_CWD: |
- return Verify("CWD /file\r\n", data, |
- use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
- "550 File Not Found\r\n"); |
- case PRE_RETR: |
- return Verify("RETR /file\r\n", data, PRE_QUIT, |
- "550 File Not Found\r\n"); |
- default: |
- return FtpSocketDataProvider::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileNotFound); |
-}; |
- |
-class FtpSocketDataProviderFileDownloadWithPasvFallback |
- : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderFileDownloadWithPasvFallback() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_RETR_EPSV: |
- return Verify("EPSV\r\n", data, PRE_RETR_PASV, "500 No can do\r\n"); |
- case PRE_CWD: |
- return Verify("CWD /file\r\n", data, |
- use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
- "550 Not a directory\r\n"); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadWithPasvFallback); |
-}; |
- |
-class FtpSocketDataProviderFileDownloadZeroSize |
- : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderFileDownloadZeroSize() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- return Verify("SIZE /file\r\n", data, PRE_CWD, |
- "213 0\r\n"); |
- case PRE_CWD: |
- return Verify("CWD /file\r\n", data, |
- use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
- "550 not a directory\r\n"); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadZeroSize); |
-}; |
- |
-class FtpSocketDataProviderFileDownloadCWD451 |
- : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderFileDownloadCWD451() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_CWD: |
- return Verify("CWD /file\r\n", data, |
- use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
- "451 not a directory\r\n"); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadCWD451); |
-}; |
- |
-class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { |
- public: |
- FtpSocketDataProviderVMSFileDownload() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SYST: |
- return Verify("SYST\r\n", data, PRE_PWD, "215 VMS\r\n"); |
- case PRE_PWD: |
- return Verify("PWD\r\n", data, PRE_TYPE, |
- "257 \"ANONYMOUS_ROOT:[000000]\"\r\n"); |
- case PRE_LIST_EPSV: |
- return Verify("EPSV\r\n", data, PRE_LIST_PASV, |
- "500 EPSV command unknown\r\n"); |
- case PRE_SIZE: |
- 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, |
- use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
- "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"); |
- default: |
- return FtpSocketDataProvider::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderVMSFileDownload); |
-}; |
- |
-class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderEscaping() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- 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, |
- use_epsv() ? PRE_RETR_EPSV : PRE_RETR_PASV, |
- "550 Not a directory\r\n"); |
- case PRE_RETR: |
- return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, |
- "200 OK\r\n"); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEscaping); |
-}; |
- |
-class FtpSocketDataProviderFileDownloadTransferStarting |
- : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderFileDownloadTransferStarting() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_RETR: |
- return Verify("RETR /file\r\n", data, PRE_QUIT, |
- "125-Data connection already open.\r\n" |
- "125 Transfer starting.\r\n" |
- "226 Transfer complete.\r\n"); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadTransferStarting); |
-}; |
- |
-class FtpSocketDataProviderDirectoryListingTransferStarting |
- : public FtpSocketDataProviderDirectoryListing { |
- public: |
- FtpSocketDataProviderDirectoryListingTransferStarting() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_LIST: |
- return Verify("LIST -l\r\n", data, PRE_QUIT, |
- "125-Data connection already open.\r\n" |
- "125 Transfer starting.\r\n" |
- "226 Transfer complete.\r\n"); |
- default: |
- return FtpSocketDataProviderDirectoryListing::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN( |
- FtpSocketDataProviderDirectoryListingTransferStarting); |
-}; |
- |
-class FtpSocketDataProviderFileDownloadInvalidResponse |
- : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderFileDownloadInvalidResponse() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- // Use unallocated 599 FTP error code to make sure it falls into the |
- // generic ERR_FTP_FAILED bucket. |
- return Verify("SIZE /file\r\n", data, PRE_QUIT, |
- "599 Evil Response\r\n" |
- "599 More Evil\r\n"); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderFileDownloadInvalidResponse); |
-}; |
- |
-class FtpSocketDataProviderEvilEpsv : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderEvilEpsv(const char* epsv_response, |
- State expected_state) |
- : epsv_response_(epsv_response), |
- epsv_response_length_(std::strlen(epsv_response)), |
- expected_state_(expected_state) {} |
- |
- FtpSocketDataProviderEvilEpsv(const char* epsv_response, |
- size_t epsv_response_length, |
- State expected_state) |
- : epsv_response_(epsv_response), |
- epsv_response_length_(epsv_response_length), |
- expected_state_(expected_state) {} |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_RETR_EPSV: |
- return Verify("EPSV\r\n", data, expected_state_, |
- epsv_response_, epsv_response_length_); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- const char* epsv_response_; |
- const size_t epsv_response_length_; |
- const State expected_state_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilEpsv); |
-}; |
- |
-class FtpSocketDataProviderEvilPasv |
- : public FtpSocketDataProviderFileDownloadWithPasvFallback { |
- public: |
- FtpSocketDataProviderEvilPasv(const char* pasv_response, State expected_state) |
- : pasv_response_(pasv_response), |
- expected_state_(expected_state) { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_RETR_PASV: |
- return Verify("PASV\r\n", data, expected_state_, pasv_response_); |
- default: |
- return FtpSocketDataProviderFileDownloadWithPasvFallback::OnWrite(data); |
- } |
- } |
- |
- private: |
- const char* pasv_response_; |
- const State expected_state_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilPasv); |
-}; |
- |
-class FtpSocketDataProviderEvilSize : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderEvilSize(const char* size_response, State expected_state) |
- : size_response_(size_response), |
- expected_state_(expected_state) { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_SIZE: |
- return Verify("SIZE /file\r\n", data, expected_state_, size_response_); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- const char* size_response_; |
- const State expected_state_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilSize); |
-}; |
- |
-class FtpSocketDataProviderEvilLogin |
- : public FtpSocketDataProviderFileDownload { |
- public: |
- FtpSocketDataProviderEvilLogin(const char* expected_user, |
- const char* expected_password) |
- : expected_user_(expected_user), |
- expected_password_(expected_password) { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_USER: |
- return Verify(std::string("USER ") + expected_user_ + "\r\n", data, |
- PRE_PASSWD, "331 Password needed\r\n"); |
- case PRE_PASSWD: |
- return Verify(std::string("PASS ") + expected_password_ + "\r\n", data, |
- PRE_SYST, "230 Welcome\r\n"); |
- default: |
- return FtpSocketDataProviderFileDownload::OnWrite(data); |
- } |
- } |
- |
- private: |
- const char* expected_user_; |
- const char* expected_password_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderEvilLogin); |
-}; |
- |
-class FtpSocketDataProviderCloseConnection : public FtpSocketDataProvider { |
- public: |
- FtpSocketDataProviderCloseConnection() { |
- } |
- |
- MockWriteResult OnWrite(const std::string& data) override { |
- if (InjectFault()) |
- return MockWriteResult(ASYNC, data.length()); |
- switch (state()) { |
- case PRE_USER: |
- return Verify("USER anonymous\r\n", data, |
- PRE_QUIT, ""); |
- default: |
- return FtpSocketDataProvider::OnWrite(data); |
- } |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(FtpSocketDataProviderCloseConnection); |
-}; |
- |
-class FtpNetworkTransactionTest |
- : public PlatformTest, |
- public ::testing::WithParamInterface<int> { |
- public: |
- FtpNetworkTransactionTest() |
- : host_resolver_(new MockHostResolver), |
- session_(new FtpNetworkSession(host_resolver_.get())), |
- transaction_(session_.get(), &mock_socket_factory_) { |
- scoped_refptr<RuleBasedHostResolverProc> rules( |
- new RuleBasedHostResolverProc(NULL)); |
- if (GetFamily() == AF_INET) { |
- rules->AddIPLiteralRule("*", "127.0.0.1", "127.0.0.1"); |
- } else if (GetFamily() == AF_INET6) { |
- rules->AddIPLiteralRule("*", "::1", "::1"); |
- } else { |
- NOTREACHED(); |
- } |
- host_resolver_->set_rules(rules.get()); |
- } |
- |
- protected: |
- // Accessor to make code refactoring-friendly, e.g. when we change the way |
- // parameters are passed (like more parameters). |
- int GetFamily() { |
- return GetParam(); |
- } |
- |
- FtpRequestInfo GetRequestInfo(const std::string& url) { |
- FtpRequestInfo info; |
- info.url = GURL(url); |
- return info; |
- } |
- |
- void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket, |
- const char* request, |
- int expected_result) { |
- // Expect EPSV usage for non-IPv4 control connections. |
- ctrl_socket->set_use_epsv((GetFamily() != AF_INET)); |
- |
- mock_socket_factory_.AddSocketDataProvider(ctrl_socket); |
- |
- std::string mock_data("mock-data"); |
- MockRead data_reads[] = { |
- // Usually FTP servers close the data connection after the entire data has |
- // been received. |
- MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
- MockRead(mock_data.c_str()), |
- }; |
- |
- scoped_ptr<StaticSocketDataProvider> data_socket( |
- new StaticSocketDataProvider(data_reads, arraysize(data_reads), NULL, |
- 0)); |
- mock_socket_factory_.AddSocketDataProvider(data_socket.get()); |
- FtpRequestInfo request_info = GetRequestInfo(request); |
- EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
- ASSERT_EQ(ERR_IO_PENDING, |
- transaction_.Start(&request_info, callback_.callback(), |
- BoundNetLog())); |
- EXPECT_NE(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
- ASSERT_EQ(expected_result, callback_.WaitForResult()); |
- if (expected_result == OK) { |
- scoped_refptr<IOBuffer> io_buffer(new IOBuffer(kBufferSize)); |
- memset(io_buffer->data(), 0, kBufferSize); |
- ASSERT_EQ(ERR_IO_PENDING, |
- transaction_.Read(io_buffer.get(), kBufferSize, |
- callback_.callback())); |
- ASSERT_EQ(static_cast<int>(mock_data.length()), |
- callback_.WaitForResult()); |
- EXPECT_EQ(mock_data, std::string(io_buffer->data(), mock_data.length())); |
- |
- // Do another Read to detect that the data socket is now closed. |
- int rv = transaction_.Read(io_buffer.get(), kBufferSize, |
- callback_.callback()); |
- if (rv == ERR_IO_PENDING) { |
- EXPECT_EQ(0, callback_.WaitForResult()); |
- } else { |
- EXPECT_EQ(0, rv); |
- } |
- } |
- EXPECT_EQ(FtpSocketDataProvider::QUIT, ctrl_socket->state()); |
- EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
- } |
- |
- void TransactionFailHelper(FtpSocketDataProvider* ctrl_socket, |
- const char* request, |
- FtpSocketDataProvider::State state, |
- FtpSocketDataProvider::State next_state, |
- const char* response, |
- int expected_result) { |
- ctrl_socket->InjectFailure(state, next_state, response); |
- ExecuteTransaction(ctrl_socket, request, expected_result); |
- } |
- |
- scoped_ptr<MockHostResolver> host_resolver_; |
- scoped_refptr<FtpNetworkSession> session_; |
- MockClientSocketFactory mock_socket_factory_; |
- FtpNetworkTransaction transaction_; |
- TestCompletionCallback callback_; |
-}; |
- |
-TEST_P(FtpNetworkTransactionTest, FailedLookup) { |
- FtpRequestInfo request_info = GetRequestInfo("ftp://badhost"); |
- scoped_refptr<RuleBasedHostResolverProc> rules( |
- new RuleBasedHostResolverProc(NULL)); |
- rules->AddSimulatedFailure("badhost"); |
- host_resolver_->set_rules(rules.get()); |
- |
- EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
- ASSERT_EQ(ERR_IO_PENDING, |
- transaction_.Start(&request_info, callback_.callback(), |
- BoundNetLog())); |
- ASSERT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); |
- EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); |
-} |
- |
-// Check that when determining the host, the square brackets decorating IPv6 |
-// literals in URLs are stripped. |
-TEST_P(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { |
- // This test only makes sense for IPv6 connections. |
- if (GetFamily() != AF_INET6) |
- return; |
- |
- host_resolver_->rules()->AddSimulatedFailure("[::1]"); |
- |
- // We start a transaction that is expected to fail with ERR_INVALID_RESPONSE. |
- // The important part of this test is to make sure that we don't fail with |
- // ERR_NAME_NOT_RESOLVED, since that would mean the decorated hostname |
- // was used. |
- FtpSocketDataProviderEvilSize ctrl_socket( |
- "213 99999999999999999999999999999999\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://[::1]/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransaction) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
- |
- EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); |
- EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
- EXPECT_EQ((GetFamily() == AF_INET) ? "127.0.0.1" : "::1", |
- transaction_.GetResponseInfo()->socket_address.host()); |
- EXPECT_EQ(21, transaction_.GetResponseInfo()->socket_address.port()); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { |
- FtpSocketDataProviderDirectoryListingWithPasvFallback ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
- |
- EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); |
- EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/;type=d", OK); |
- |
- EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); |
- EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- ctrl_socket.set_multiline_welcome(true); |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionShortReads2) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- ctrl_socket.set_short_read_limit(2); |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionShortReads5) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- ctrl_socket.set_short_read_limit(5); |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcomeShort) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- // The client will not consume all three 230 lines. That's good, we want to |
- // test that scenario. |
- ctrl_socket.allow_unconsumed_reads(true); |
- ctrl_socket.set_multiline_welcome(true); |
- ctrl_socket.set_short_read_limit(5); |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
-} |
- |
-// Regression test for http://crbug.com/60555. |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionZeroSize) { |
- FtpSocketDataProviderDirectoryListingZeroSize ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionVMS) { |
- FtpSocketDataProviderVMSDirectoryListing ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/dir", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionVMSRootDirectory) { |
- FtpSocketDataProviderVMSDirectoryListingRootDirectory ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionTransferStarting) { |
- FtpSocketDataProviderDirectoryListingTransferStarting ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransaction) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
- |
- // We pass an artificial value of 18 as a response to the SIZE command. |
- EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
- EXPECT_EQ((GetFamily() == AF_INET) ? "127.0.0.1" : "::1", |
- transaction_.GetResponseInfo()->socket_address.host()); |
- EXPECT_EQ(21, transaction_.GetResponseInfo()->socket_address.port()); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithPasvFallback) { |
- FtpSocketDataProviderFileDownloadWithPasvFallback ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
- |
- // We pass an artificial value of 18 as a response to the SIZE command. |
- EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { |
- FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; |
- ctrl_socket.set_data_type('A'); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=a", OK); |
- |
- // We pass an artificial value of 18 as a response to the SIZE command. |
- EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeI) { |
- 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. |
- EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionMultilineWelcome) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- ctrl_socket.set_multiline_welcome(true); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionShortReads2) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- ctrl_socket.set_short_read_limit(2); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionShortReads5) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- ctrl_socket.set_short_read_limit(5); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionZeroSize) { |
- FtpSocketDataProviderFileDownloadZeroSize ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionCWD451) { |
- FtpSocketDataProviderFileDownloadCWD451 ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionVMS) { |
- FtpSocketDataProviderVMSFileDownload ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { |
- FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { |
- FtpSocketDataProviderFileDownloadInvalidResponse ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvReallyBadFormat) { |
- FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort1) { |
- FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,0,22)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort2) { |
- // Still unsafe. 1 * 256 + 2 = 258, which is < 1024. |
- FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,1,2)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort3) { |
- // Still unsafe. 3 * 256 + 4 = 772, which is < 1024. |
- FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,3,4)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort4) { |
- // Unsafe. 8 * 256 + 1 = 2049, which is used by nfs. |
- FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,8,1)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { |
- FtpSocketDataProviderEvilPasv ctrl_socket( |
- "227 Portscan (10,1,2,3,123,456)\r\n", FtpSocketDataProvider::PRE_RETR); |
- ctrl_socket.set_use_epsv(GetFamily() != AF_INET); |
- std::string mock_data("mock-data"); |
- MockRead data_reads[] = { |
- MockRead(mock_data.c_str()), |
- }; |
- StaticSocketDataProvider data_socket1; |
- StaticSocketDataProvider data_socket2(data_reads, arraysize(data_reads), |
- NULL, 0); |
- mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); |
- mock_socket_factory_.AddSocketDataProvider(&data_socket1); |
- mock_socket_factory_.AddSocketDataProvider(&data_socket2); |
- FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
- |
- // Start the transaction. |
- ASSERT_EQ(ERR_IO_PENDING, |
- transaction_.Start(&request_info, callback_.callback(), |
- BoundNetLog())); |
- ASSERT_EQ(OK, callback_.WaitForResult()); |
- |
- // The transaction fires the callback when we can start reading data. That |
- // means that the data socket should be open. |
- MockTCPClientSocket* data_socket = |
- static_cast<MockTCPClientSocket*>(transaction_.data_socket_.get()); |
- ASSERT_TRUE(data_socket); |
- ASSERT_TRUE(data_socket->IsConnected()); |
- |
- // Even if the PASV response specified some other address, we connect |
- // to the address we used for control connection (which could be 127.0.0.1 |
- // or ::1 depending on whether we use IPv6). |
- for (AddressList::const_iterator it = data_socket->addresses().begin(); |
- it != data_socket->addresses().end(); ++it) { |
- EXPECT_NE("10.1.2.3", it->ToStringWithoutPort()); |
- } |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat2) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat3) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat4) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||||)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- // Breaking the string in the next line prevents MSVC warning C4125. |
- const char response[] = "227 Portscan (\0\0\031" "773\0)\r\n"; |
- FtpSocketDataProviderEvilEpsv ctrl_socket(response, sizeof(response)-1, |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort2) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||258|)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort3) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||772|)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort4) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||2049|)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvWeirdSep) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$31744$)\r\n", |
- FtpSocketDataProvider::PRE_RETR); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, |
- DownloadTransactionEvilEpsvWeirdSepUnsafePort) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$317$)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvIllegalHost) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|2|::1|31744|)\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { |
- FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); |
- ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { |
- FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); |
- ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionSpaceInLogin) { |
- FtpSocketDataProviderEvilLogin ctrl_socket("hello world", "test"); |
- ExecuteTransaction(&ctrl_socket, "ftp://hello%20world:test@host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionSpaceInPassword) { |
- FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello world"); |
- ExecuteTransaction(&ctrl_socket, "ftp://test:hello%20world@host/file", OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, EvilRestartUser) { |
- FtpSocketDataProvider ctrl_socket1; |
- ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
- FtpSocketDataProvider::PRE_QUIT, |
- "530 Login authentication failed\r\n"); |
- mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
- |
- FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
- |
- ASSERT_EQ(ERR_IO_PENDING, |
- transaction_.Start(&request_info, callback_.callback(), |
- BoundNetLog())); |
- ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); |
- |
- MockRead ctrl_reads[] = { |
- MockRead("220 host TestFTPd\r\n"), |
- MockRead("221 Goodbye!\r\n"), |
- MockRead(SYNCHRONOUS, OK), |
- }; |
- MockWrite ctrl_writes[] = { |
- MockWrite("QUIT\r\n"), |
- }; |
- StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
- ctrl_writes, arraysize(ctrl_writes)); |
- mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
- ASSERT_EQ(ERR_IO_PENDING, |
- transaction_.RestartWithAuth( |
- AuthCredentials( |
- base::ASCIIToUTF16("foo\nownz0red"), |
- base::ASCIIToUTF16("innocent")), |
- callback_.callback())); |
- EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, EvilRestartPassword) { |
- FtpSocketDataProvider ctrl_socket1; |
- ctrl_socket1.InjectFailure(FtpSocketDataProvider::PRE_PASSWD, |
- FtpSocketDataProvider::PRE_QUIT, |
- "530 Login authentication failed\r\n"); |
- mock_socket_factory_.AddSocketDataProvider(&ctrl_socket1); |
- |
- FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); |
- |
- ASSERT_EQ(ERR_IO_PENDING, |
- transaction_.Start(&request_info, callback_.callback(), |
- BoundNetLog())); |
- ASSERT_EQ(ERR_FTP_FAILED, callback_.WaitForResult()); |
- |
- MockRead ctrl_reads[] = { |
- MockRead("220 host TestFTPd\r\n"), |
- MockRead("331 User okay, send password\r\n"), |
- MockRead("221 Goodbye!\r\n"), |
- MockRead(SYNCHRONOUS, OK), |
- }; |
- MockWrite ctrl_writes[] = { |
- MockWrite("USER innocent\r\n"), |
- MockWrite("QUIT\r\n"), |
- }; |
- StaticSocketDataProvider ctrl_socket2(ctrl_reads, arraysize(ctrl_reads), |
- ctrl_writes, arraysize(ctrl_writes)); |
- mock_socket_factory_.AddSocketDataProvider(&ctrl_socket2); |
- ASSERT_EQ(ERR_IO_PENDING, |
- transaction_.RestartWithAuth( |
- AuthCredentials(base::ASCIIToUTF16("innocent"), |
- base::ASCIIToUTF16("foo\nownz0red")), |
- callback_.callback())); |
- EXPECT_EQ(ERR_MALFORMED_IDENTITY, callback_.WaitForResult()); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, Escaping) { |
- FtpSocketDataProviderEscaping ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", |
- OK); |
-} |
- |
-// Test for http://crbug.com/23794. |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { |
- // Try to overflow int64 in the response. |
- FtpSocketDataProviderEvilSize ctrl_socket( |
- "213 99999999999999999999999999999999\r\n", |
- FtpSocketDataProvider::PRE_QUIT); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); |
-} |
- |
-// Test for http://crbug.com/36360. |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionBigSize) { |
- // Pass a valid, but large file size. The transaction should not fail. |
- FtpSocketDataProviderEvilSize ctrl_socket( |
- "213 3204427776\r\n", |
- FtpSocketDataProvider::PRE_CWD); |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); |
- EXPECT_EQ(3204427776LL, |
- transaction_.GetResponseInfo()->expected_content_size); |
-} |
- |
-// Regression test for http://crbug.com/25023. |
-TEST_P(FtpNetworkTransactionTest, CloseConnection) { |
- FtpSocketDataProviderCloseConnection ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host", |
- FtpSocketDataProvider::PRE_USER, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailPass) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host", |
- FtpSocketDataProvider::PRE_PASSWD, |
- FtpSocketDataProvider::PRE_QUIT, |
- "530 Login authentication failed\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-// Regression test for http://crbug.com/38707. |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailPass503) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host", |
- FtpSocketDataProvider::PRE_PASSWD, |
- FtpSocketDataProvider::PRE_QUIT, |
- "503 Bad sequence of commands\r\n", |
- ERR_FTP_BAD_COMMAND_SEQUENCE); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailSyst) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host", |
- FtpSocketDataProvider::PRE_SYST, |
- FtpSocketDataProvider::PRE_PWD, |
- "599 fail\r\n", |
- OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailPwd) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host", |
- FtpSocketDataProvider::PRE_PWD, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailType) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host", |
- FtpSocketDataProvider::PRE_TYPE, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailEpsv) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper( |
- &ctrl_socket, "ftp://host", FtpSocketDataProvider::PRE_LIST_EPSV, |
- FtpSocketDataProvider::PRE_NOPASV, "599 fail\r\n", ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailCwd) { |
- FtpSocketDataProviderDirectoryListing ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host", |
- FtpSocketDataProvider::PRE_CWD, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DirectoryTransactionFailList) { |
- FtpSocketDataProviderVMSDirectoryListing ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host/dir", |
- FtpSocketDataProvider::PRE_LIST, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailUser) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host/file", |
- FtpSocketDataProvider::PRE_USER, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailPass) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host/file", |
- FtpSocketDataProvider::PRE_PASSWD, |
- FtpSocketDataProvider::PRE_QUIT, |
- "530 Login authentication failed\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailSyst) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host/file", |
- FtpSocketDataProvider::PRE_SYST, |
- FtpSocketDataProvider::PRE_PWD, |
- "599 fail\r\n", |
- OK); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailPwd) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host/file", |
- FtpSocketDataProvider::PRE_PWD, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailType) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host/file", |
- FtpSocketDataProvider::PRE_TYPE, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailEpsv) { |
- // This test makes no sense for IPv4 connections (we don't use EPSV there). |
- if (GetFamily() == AF_INET) |
- return; |
- |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper( |
- &ctrl_socket, "ftp://host/file", FtpSocketDataProvider::PRE_RETR_EPSV, |
- FtpSocketDataProvider::PRE_NOPASV, "599 fail\r\n", ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- // Use unallocated 599 FTP error code to make sure it falls into the generic |
- // ERR_FTP_FAILED bucket. |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host/file", |
- FtpSocketDataProvider::PRE_RETR, |
- FtpSocketDataProvider::PRE_QUIT, |
- "599 fail\r\n", |
- ERR_FTP_FAILED); |
-} |
- |
-TEST_P(FtpNetworkTransactionTest, FileNotFound) { |
- FtpSocketDataProviderFileNotFound ctrl_socket; |
- ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); |
-} |
- |
-// Test for http://crbug.com/38845. |
-TEST_P(FtpNetworkTransactionTest, ZeroLengthDirInPWD) { |
- FtpSocketDataProviderFileDownload ctrl_socket; |
- TransactionFailHelper(&ctrl_socket, |
- "ftp://host/file", |
- FtpSocketDataProvider::PRE_PWD, |
- FtpSocketDataProvider::PRE_TYPE, |
- "257 \"\"\r\n", |
- OK); |
-} |
- |
-INSTANTIATE_TEST_CASE_P(FTP, |
- FtpNetworkTransactionTest, |
- ::testing::Values(AF_INET, AF_INET6)); |
- |
-} // namespace net |