Index: net/test/test_server.h |
diff --git a/net/test/test_server.h b/net/test/test_server.h |
index 8c3f2f3ce0134941e692f068635c0bc194e153bb..20fda5862729a92a0cde1df170be32202ac31901 100644 |
--- a/net/test/test_server.h |
+++ b/net/test/test_server.h |
@@ -13,24 +13,27 @@ |
#include "base/compiler_specific.h" |
#include "base/file_path.h" |
#include "base/process_util.h" |
+#include "base/ref_counted.h" |
+#include "base/string_util.h" |
+#include "googleurl/src/gurl.h" |
#if defined(OS_WIN) |
#include "base/scoped_handle_win.h" |
#endif |
#if defined(USE_NSS) |
-#include "base/ref_counted.h" |
#include "net/base/x509_certificate.h" |
#endif |
namespace net { |
+const int kHTTPDefaultPort = 1337; |
+const int kFTPDefaultPort = 1338; |
+ |
+const char kDefaultHostName[] = "localhost"; |
+ |
// This object bounds the lifetime of an external python-based HTTP/HTTPS/FTP |
// server that can provide various responses useful for testing. |
-// A few basic convenience methods are provided, but no |
-// URL handling methods (those belong at a higher layer, e.g. in |
-// url_request_unittest.h). |
- |
class TestServerLauncher { |
public: |
TestServerLauncher(); |
@@ -131,6 +134,208 @@ bool LaunchTestServerAsJob(const std::wstring& cmdline, |
ScopedHandle* job_handle); |
#endif |
+// This object bounds the lifetime of an external python-based HTTP/FTP server |
+// that can provide various responses useful for testing. |
+class BaseTestServer : public base::RefCounted<BaseTestServer> { |
+ protected: |
+ BaseTestServer() {} |
+ |
+ public: |
+ bool WaitToFinish(int milliseconds) { |
+ return launcher_.WaitToFinish(milliseconds); |
+ } |
+ |
+ bool Stop() { |
+ return launcher_.Stop(); |
+ } |
+ |
+ GURL TestServerPage(const std::string& base_address, |
+ const std::string& path) { |
+ return GURL(base_address + path); |
+ } |
+ |
+ GURL TestServerPage(const std::string& path) { |
+ // TODO(phajdan.jr): Check for problems with IPv6. |
+ return GURL(scheme_ + "://" + host_name_ + ":" + port_str_ + "/" + path); |
+ } |
+ |
+ GURL TestServerPage(const std::string& path, |
+ const std::string& user, |
+ const std::string& password) { |
+ // TODO(phajdan.jr): Check for problems with IPv6. |
+ |
+ if (password.empty()) |
+ return GURL(scheme_ + "://" + user + "@" + |
+ host_name_ + ":" + port_str_ + "/" + path); |
+ |
+ return GURL(scheme_ + "://" + user + ":" + password + |
+ "@" + host_name_ + ":" + port_str_ + "/" + path); |
+ } |
+ |
+ FilePath GetDataDirectory() { |
+ return launcher_.GetDocumentRootPath(); |
+ } |
+ |
+ protected: |
+ friend class base::RefCounted<BaseTestServer>; |
+ virtual ~BaseTestServer() { } |
+ |
+ bool Start(net::TestServerLauncher::Protocol protocol, |
+ const std::string& host_name, int port, |
+ const FilePath& document_root, |
+ const FilePath& cert_path, |
+ const std::wstring& file_root_url) { |
+ if (!launcher_.Start(protocol, |
+ host_name, port, document_root, cert_path, file_root_url)) |
+ return false; |
+ |
+ if (protocol == net::TestServerLauncher::ProtoFTP) |
+ scheme_ = "ftp"; |
+ else |
+ scheme_ = "http"; |
+ if (!cert_path.empty()) |
+ scheme_.push_back('s'); |
+ |
+ host_name_ = host_name; |
+ port_str_ = IntToString(port); |
+ return true; |
+ } |
+ |
+ net::TestServerLauncher launcher_; |
+ std::string scheme_; |
+ std::string host_name_; |
+ std::string port_str_; |
+}; |
+ |
+class HTTPTestServer : public BaseTestServer { |
+ protected: |
+ HTTPTestServer() {} |
+ |
+ public: |
+ // Creates and returns a new HTTPTestServer. |
+ static scoped_refptr<HTTPTestServer> CreateServer( |
+ const std::wstring& document_root) { |
+ return CreateServerWithFileRootURL(document_root, std::wstring()); |
+ } |
+ |
+ static scoped_refptr<HTTPTestServer> CreateServerWithFileRootURL( |
+ const std::wstring& document_root, |
+ const std::wstring& file_root_url) { |
+ scoped_refptr<HTTPTestServer> test_server(new HTTPTestServer()); |
+ FilePath no_cert; |
+ FilePath docroot = FilePath::FromWStringHack(document_root); |
+ if (!StartTestServer(test_server.get(), docroot, no_cert, file_root_url)) |
+ return NULL; |
+ return test_server; |
+ } |
+ |
+ static bool StartTestServer(HTTPTestServer* server, |
+ const FilePath& document_root, |
+ const FilePath& cert_path, |
+ const std::wstring& file_root_url) { |
+ return server->Start(net::TestServerLauncher::ProtoHTTP, kDefaultHostName, |
+ kHTTPDefaultPort, document_root, cert_path, |
+ file_root_url); |
+ } |
+}; |
+ |
+class HTTPSTestServer : public HTTPTestServer { |
+ protected: |
+ HTTPSTestServer() {} |
+ |
+ public: |
+ // Create a server with a valid certificate |
+ // TODO(dkegel): HTTPSTestServer should not require an instance to specify |
+ // stock test certificates |
+ static scoped_refptr<HTTPSTestServer> CreateGoodServer( |
+ const std::wstring& document_root) { |
+ scoped_refptr<HTTPSTestServer> test_server = new HTTPSTestServer(); |
+ FilePath docroot = FilePath::FromWStringHack(document_root); |
+ FilePath certpath = test_server->launcher_.GetOKCertPath(); |
+ if (!test_server->Start(net::TestServerLauncher::ProtoHTTP, |
+ net::TestServerLauncher::kHostName, |
+ net::TestServerLauncher::kOKHTTPSPort, |
+ docroot, certpath, std::wstring())) { |
+ return NULL; |
+ } |
+ return test_server; |
+ } |
+ |
+ // Create a server with an up to date certificate for the wrong hostname |
+ // for this host |
+ static scoped_refptr<HTTPSTestServer> CreateMismatchedServer( |
+ const std::wstring& document_root) { |
+ scoped_refptr<HTTPSTestServer> test_server = new HTTPSTestServer(); |
+ FilePath docroot = FilePath::FromWStringHack(document_root); |
+ FilePath certpath = test_server->launcher_.GetOKCertPath(); |
+ if (!test_server->Start(net::TestServerLauncher::ProtoHTTP, |
+ net::TestServerLauncher::kMismatchedHostName, |
+ net::TestServerLauncher::kOKHTTPSPort, |
+ docroot, certpath, std::wstring())) { |
+ return NULL; |
+ } |
+ return test_server; |
+ } |
+ |
+ // Create a server with an expired certificate |
+ static scoped_refptr<HTTPSTestServer> CreateExpiredServer( |
+ const std::wstring& document_root) { |
+ scoped_refptr<HTTPSTestServer> test_server = new HTTPSTestServer(); |
+ FilePath docroot = FilePath::FromWStringHack(document_root); |
+ FilePath certpath = test_server->launcher_.GetExpiredCertPath(); |
+ if (!test_server->Start(net::TestServerLauncher::ProtoHTTP, |
+ net::TestServerLauncher::kHostName, |
+ net::TestServerLauncher::kBadHTTPSPort, |
+ docroot, certpath, std::wstring())) { |
+ return NULL; |
+ } |
+ return test_server; |
+ } |
+ |
+ // Create a server with an arbitrary certificate |
+ static scoped_refptr<HTTPSTestServer> CreateServer( |
+ const std::string& host_name, int port, |
+ const std::wstring& document_root, |
+ const std::wstring& cert_path) { |
+ scoped_refptr<HTTPSTestServer> test_server = new HTTPSTestServer(); |
+ FilePath docroot = FilePath::FromWStringHack(document_root); |
+ FilePath certpath = FilePath::FromWStringHack(cert_path); |
+ if (!test_server->Start(net::TestServerLauncher::ProtoHTTP, |
+ host_name, port, docroot, certpath, std::wstring())) { |
+ return NULL; |
+ } |
+ return test_server; |
+ } |
+ |
+ protected: |
+ std::wstring cert_path_; |
+ |
+ private: |
+ virtual ~HTTPSTestServer() {} |
+}; |
+ |
+class FTPTestServer : public BaseTestServer { |
+ public: |
+ FTPTestServer() { |
+ } |
+ |
+ static scoped_refptr<FTPTestServer> CreateServer( |
+ const std::wstring& document_root) { |
+ scoped_refptr<FTPTestServer> test_server = new FTPTestServer(); |
+ FilePath docroot = FilePath::FromWStringHack(document_root); |
+ FilePath no_cert; |
+ if (!test_server->Start(net::TestServerLauncher::ProtoFTP, |
+ kDefaultHostName, kFTPDefaultPort, docroot, no_cert, std::wstring())) { |
+ return NULL; |
+ } |
+ return test_server; |
+ } |
+ |
+ private: |
+ ~FTPTestServer() {} |
+}; |
+ |
+ |
} // namespace net |
#endif // NET_TEST_TEST_SERVER_H_ |