summaryrefslogtreecommitdiff
path: root/net/test/test_server.cc
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-11-18 18:32:45 +0000
committerBen Murdoch <benm@google.com>2010-11-18 18:38:07 +0000
commit513209b27ff55e2841eac0e4120199c23acce758 (patch)
treeaeba30bb08c5f47c57003544e378a377c297eee6 /net/test/test_server.cc
parent164f7496de0fbee436b385a79ead9e3cb81a50c1 (diff)
downloadchromium-513209b27ff55e2841eac0e4120199c23acce758.tar.gz
Merge Chromium at r65505: Initial merge by git.
Change-Id: I31d8f1d8cd33caaf7f47ffa7350aef42d5fbdb45
Diffstat (limited to 'net/test/test_server.cc')
-rw-r--r--net/test/test_server.cc177
1 files changed, 129 insertions, 48 deletions
diff --git a/net/test/test_server.cc b/net/test/test_server.cc
index c3359a42..4b426eb4 100644
--- a/net/test/test_server.cc
+++ b/net/test/test_server.cc
@@ -15,8 +15,8 @@
#endif
#include "base/command_line.h"
+#include "base/debug/leak_annotations.h"
#include "base/file_util.h"
-#include "base/leak_annotations.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/string_number_conversions.h"
@@ -30,6 +30,8 @@
#include "net/test/python_utils.h"
#include "testing/platform_test.h"
+namespace net {
+
namespace {
// Number of connection attempts for tests.
@@ -40,30 +42,43 @@ const int kServerConnectionTimeoutMs = 1000;
const char kTestServerShardFlag[] = "test-server-shard";
-int GetPortBase(net::TestServer::Type type) {
- switch (type) {
- case net::TestServer::TYPE_FTP:
- return 3117;
- case net::TestServer::TYPE_HTTP:
- return 1337;
- case net::TestServer::TYPE_HTTPS:
+int GetHTTPSPortBase(const TestServer::HTTPSOptions& options) {
+ if (options.request_client_certificate)
+ return 9543;
+
+ switch (options.server_certificate) {
+ case TestServer::HTTPSOptions::CERT_OK:
return 9443;
- case net::TestServer::TYPE_HTTPS_CLIENT_AUTH:
- return 9543;
- case net::TestServer::TYPE_HTTPS_EXPIRED_CERTIFICATE:
+ case TestServer::HTTPSOptions::CERT_MISMATCHED_NAME:
+ return 9643;
+ case TestServer::HTTPSOptions::CERT_EXPIRED:
// TODO(phajdan.jr): Some tests rely on this hardcoded value.
// Some uses of this are actually in .html/.js files.
return 9666;
- case net::TestServer::TYPE_HTTPS_MISMATCHED_HOSTNAME:
- return 9643;
default:
NOTREACHED();
}
return -1;
}
-int GetPort(net::TestServer::Type type) {
- int port = GetPortBase(type);
+int GetPortBase(TestServer::Type type,
+ const TestServer::HTTPSOptions& options) {
+ switch (type) {
+ case TestServer::TYPE_FTP:
+ return 3117;
+ case TestServer::TYPE_HTTP:
+ return 1337;
+ case TestServer::TYPE_HTTPS:
+ return GetHTTPSPortBase(options);
+ default:
+ NOTREACHED();
+ }
+ return -1;
+}
+
+int GetPort(TestServer::Type type,
+ const TestServer::HTTPSOptions& options) {
+ int port = GetPortBase(type, options);
if (CommandLine::ForCurrentProcess()->HasSwitch(kTestServerShardFlag)) {
std::string shard_str(CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
kTestServerShardFlag));
@@ -78,8 +93,11 @@ int GetPort(net::TestServer::Type type) {
return port;
}
-std::string GetHostname(net::TestServer::Type type) {
- if (type == net::TestServer::TYPE_HTTPS_MISMATCHED_HOSTNAME) {
+std::string GetHostname(TestServer::Type type,
+ const TestServer::HTTPSOptions& options) {
+ if (type == TestServer::TYPE_HTTPS &&
+ options.server_certificate ==
+ TestServer::HTTPSOptions::CERT_MISMATCHED_NAME) {
// Return a different hostname string that resolves to the same hostname.
return "localhost";
}
@@ -89,16 +107,59 @@ std::string GetHostname(net::TestServer::Type type) {
} // namespace
-namespace net {
-
#if defined(OS_MACOSX)
void SetMacTestCertificate(X509Certificate* cert);
#endif
+TestServer::HTTPSOptions::HTTPSOptions()
+ : server_certificate(CERT_OK),
+ request_client_certificate(false),
+ bulk_ciphers(HTTPSOptions::BULK_CIPHER_ANY) {}
+
+TestServer::HTTPSOptions::HTTPSOptions(
+ TestServer::HTTPSOptions::ServerCertificate cert)
+ : server_certificate(cert),
+ request_client_certificate(false),
+ bulk_ciphers(HTTPSOptions::BULK_CIPHER_ANY) {}
+
+TestServer::HTTPSOptions::~HTTPSOptions() {}
+
+FilePath TestServer::HTTPSOptions::GetCertificateFile() const {
+ switch (server_certificate) {
+ case CERT_OK:
+ case CERT_MISMATCHED_NAME:
+ return FilePath(FILE_PATH_LITERAL("ok_cert.pem"));
+ case CERT_EXPIRED:
+ return FilePath(FILE_PATH_LITERAL("expired_cert.pem"));
+ default:
+ NOTREACHED();
+ }
+ return FilePath();
+}
+
TestServer::TestServer(Type type, const FilePath& document_root)
- : host_port_pair_(GetHostname(type), GetPort(type)),
- process_handle_(base::kNullProcessHandle),
- type_(type) {
+ : type_(type) {
+ Init(document_root);
+}
+
+TestServer::TestServer(const HTTPSOptions& https_options,
+ const FilePath& document_root)
+ : https_options_(https_options), type_(TYPE_HTTPS) {
+ Init(document_root);
+}
+
+TestServer::~TestServer() {
+#if defined(OS_MACOSX)
+ SetMacTestCertificate(NULL);
+#endif
+ Stop();
+}
+
+void TestServer::Init(const FilePath& document_root) {
+ host_port_pair_ = HostPortPair(GetHostname(type_, https_options_),
+ GetPort(type_, https_options_));
+ process_handle_ = base::kNullProcessHandle;
+
FilePath src_dir;
PathService::Get(base::DIR_SOURCE_ROOT, &src_dir);
@@ -110,15 +171,8 @@ TestServer::TestServer(Type type, const FilePath& document_root)
.Append(FILE_PATH_LITERAL("certificates"));
}
-TestServer::~TestServer() {
-#if defined(OS_MACOSX)
- SetMacTestCertificate(NULL);
-#endif
- Stop();
-}
-
bool TestServer::Start() {
- if (GetScheme() == "https") {
+ if (type_ == TYPE_HTTPS) {
if (!LoadTestRootCert())
return false;
if (!CheckCATrusted())
@@ -177,9 +231,6 @@ std::string TestServer::GetScheme() const {
case TYPE_HTTP:
return "http";
case TYPE_HTTPS:
- case TYPE_HTTPS_CLIENT_AUTH:
- case TYPE_HTTPS_MISMATCHED_HOSTNAME:
- case TYPE_HTTPS_EXPIRED_CERTIFICATE:
return "https";
default:
NOTREACHED();
@@ -191,7 +242,7 @@ bool TestServer::GetAddressList(AddressList* address_list) const {
DCHECK(address_list);
scoped_ptr<HostResolver> resolver(
- CreateSystemHostResolver(HostResolver::kDefaultParallelism, NULL));
+ CreateSystemHostResolver(HostResolver::kDefaultParallelism, NULL, NULL));
HostResolver::RequestInfo info(host_port_pair_);
int rv = resolver->Resolve(info, address_list, NULL, NULL, BoundNetLog());
if (rv != net::OK) {
@@ -292,21 +343,51 @@ bool TestServer::LoadTestRootCert() {
#endif
}
-FilePath TestServer::GetCertificatePath() {
- switch (type_) {
- case TYPE_FTP:
- case TYPE_HTTP:
- return FilePath();
- case TYPE_HTTPS:
- case TYPE_HTTPS_CLIENT_AUTH:
- case TYPE_HTTPS_MISMATCHED_HOSTNAME:
- return certificates_dir_.AppendASCII("ok_cert.pem");
- case TYPE_HTTPS_EXPIRED_CERTIFICATE:
- return certificates_dir_.AppendASCII("expired_cert.pem");
- default:
- NOTREACHED();
+bool TestServer::AddCommandLineArguments(CommandLine* command_line) const {
+ command_line->AppendSwitchASCII("port",
+ base::IntToString(host_port_pair_.port()));
+ command_line->AppendSwitchPath("data-dir", document_root_);
+
+ if (type_ == TYPE_FTP) {
+ command_line->AppendArg("-f");
+ } else if (type_ == TYPE_HTTPS) {
+ FilePath certificate_path(certificates_dir_);
+ certificate_path = certificate_path.Append(
+ https_options_.GetCertificateFile());
+ if (!file_util::PathExists(certificate_path)) {
+ LOG(ERROR) << "Certificate path " << certificate_path.value()
+ << " doesn't exist. Can't launch https server.";
+ return false;
+ }
+ command_line->AppendSwitchPath("https", certificate_path);
+
+ if (https_options_.request_client_certificate)
+ command_line->AppendSwitch("ssl-client-auth");
+
+ for (std::vector<FilePath>::const_iterator it =
+ https_options_.client_authorities.begin();
+ it != https_options_.client_authorities.end(); ++it) {
+ if (!file_util::PathExists(*it)) {
+ LOG(ERROR) << "Client authority path " << it->value()
+ << " doesn't exist. Can't launch https server.";
+ return false;
+ }
+
+ command_line->AppendSwitchPath("ssl-client-ca", *it);
+ }
+
+ const char kBulkCipherSwitch[] = "ssl-bulk-cipher";
+ if (https_options_.bulk_ciphers & HTTPSOptions::BULK_CIPHER_RC4)
+ command_line->AppendSwitchASCII(kBulkCipherSwitch, "rc4");
+ if (https_options_.bulk_ciphers & HTTPSOptions::BULK_CIPHER_AES128)
+ command_line->AppendSwitchASCII(kBulkCipherSwitch, "aes128");
+ if (https_options_.bulk_ciphers & HTTPSOptions::BULK_CIPHER_AES256)
+ command_line->AppendSwitchASCII(kBulkCipherSwitch, "aes256");
+ if (https_options_.bulk_ciphers & HTTPSOptions::BULK_CIPHER_3DES)
+ command_line->AppendSwitchASCII(kBulkCipherSwitch, "3des");
}
- return FilePath();
+
+ return true;
}
} // namespace net