summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/test/test_server.cc75
-rw-r--r--net/test/test_server.h5
-rw-r--r--net/test/test_server_posix.cc47
-rw-r--r--net/test/test_server_win.cc26
-rwxr-xr-xnet/tools/testserver/testserver.py26
5 files changed, 86 insertions, 93 deletions
diff --git a/net/test/test_server.cc b/net/test/test_server.cc
index 1e6ff64..4b426eb 100644
--- a/net/test/test_server.cc
+++ b/net/test/test_server.cc
@@ -40,6 +40,59 @@ const int kServerConnectionAttempts = 10;
// Connection timeout in milliseconds for tests.
const int kServerConnectionTimeoutMs = 1000;
+const char kTestServerShardFlag[] = "test-server-shard";
+
+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 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;
+ default:
+ NOTREACHED();
+ }
+ return -1;
+}
+
+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));
+ int shard = -1;
+ if (base::StringToInt(shard_str, &shard)) {
+ port += shard;
+ } else {
+ LOG(FATAL) << "Got invalid " << kTestServerShardFlag << " flag value. "
+ << "An integer is expected.";
+ }
+ }
+ return port;
+}
+
std::string GetHostname(TestServer::Type type,
const TestServer::HTTPSOptions& options) {
if (type == TestServer::TYPE_HTTPS &&
@@ -85,16 +138,13 @@ FilePath TestServer::HTTPSOptions::GetCertificateFile() const {
}
TestServer::TestServer(Type type, const FilePath& document_root)
- : type_(type),
- started_(false) {
+ : type_(type) {
Init(document_root);
}
TestServer::TestServer(const HTTPSOptions& https_options,
const FilePath& document_root)
- : https_options_(https_options),
- type_(TYPE_HTTPS),
- started_(false) {
+ : https_options_(https_options), type_(TYPE_HTTPS) {
Init(document_root);
}
@@ -106,11 +156,8 @@ TestServer::~TestServer() {
}
void TestServer::Init(const FilePath& document_root) {
- // At this point, the port that the testserver will listen on is unknown.
- // The testserver will listen on an ephemeral port, and write the port
- // number out over a pipe that this TestServer object will read from. Once
- // that is complete, the host_port_pair_ will contain the actual port.
- host_port_pair_ = HostPortPair(GetHostname(type_, https_options_), 0);
+ host_port_pair_ = HostPortPair(GetHostname(type_, https_options_),
+ GetPort(type_, https_options_));
process_handle_ = base::kNullProcessHandle;
FilePath src_dir;
@@ -155,7 +202,6 @@ bool TestServer::Start() {
return false;
}
- started_ = true;
return true;
}
@@ -163,8 +209,6 @@ bool TestServer::Stop() {
if (!process_handle_)
return true;
- started_ = false;
-
// First check if the process has already terminated.
bool ret = base::WaitForSingleProcess(process_handle_, 0);
if (!ret)
@@ -180,11 +224,6 @@ bool TestServer::Stop() {
return ret;
}
-const HostPortPair& TestServer::host_port_pair() const {
- DCHECK(started_);
- return host_port_pair_;
-}
-
std::string TestServer::GetScheme() const {
switch (type_) {
case TYPE_FTP:
diff --git a/net/test/test_server.h b/net/test/test_server.h
index e0cadab..8affc12 100644
--- a/net/test/test_server.h
+++ b/net/test/test_server.h
@@ -113,7 +113,7 @@ class TestServer {
bool Stop();
const FilePath& document_root() const { return document_root_; }
- const HostPortPair& host_port_pair() const;
+ const HostPortPair& host_port_pair() const { return host_port_pair_; }
std::string GetScheme() const;
bool GetAddressList(AddressList* address_list) const WARN_UNUSED_RESULT;
@@ -189,9 +189,6 @@ class TestServer {
Type type_;
- // Has the server been started?
- bool started_;
-
DISALLOW_COPY_AND_ASSIGN(TestServer);
};
diff --git a/net/test/test_server_posix.cc b/net/test/test_server_posix.cc
index 9c0210b..707eb93 100644
--- a/net/test/test_server_posix.cc
+++ b/net/test/test_server_posix.cc
@@ -98,45 +98,24 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) {
}
bool TestServer::WaitToStart() {
- uint16 port;
- uint8* buffer = reinterpret_cast<uint8*>(&port);
- ssize_t bytes_read = 0;
- ssize_t bytes_max = sizeof(port);
- base::TimeDelta remaining_time = base::TimeDelta::FromMilliseconds(
- TestTimeouts::action_max_timeout_ms());
- base::Time previous_time = base::Time::Now();
- while (bytes_read < bytes_max) {
- struct pollfd poll_fds[1];
-
- poll_fds[0].fd = child_fd_;
- poll_fds[0].events = POLLIN | POLLPRI;
- poll_fds[0].revents = 0;
-
- int rv = HANDLE_EINTR(poll(poll_fds, 1, remaining_time.InMilliseconds()));
- if (rv != 1) {
- LOG(ERROR) << "Failed to poll for the child file descriptor.";
- return false;
- }
+ struct pollfd poll_fds[1];
+
+ poll_fds[0].fd = child_fd_;
+ poll_fds[0].events = POLLIN | POLLPRI;
+ poll_fds[0].revents = 0;
- base::Time current_time = base::Time::Now();
- base::TimeDelta elapsed_time_cycle = current_time - previous_time;
- DCHECK(elapsed_time_cycle.InMilliseconds() >= 0);
- remaining_time -= elapsed_time_cycle;
- previous_time = current_time;
-
- ssize_t num_bytes = HANDLE_EINTR(read(child_fd_, buffer + bytes_read,
- bytes_max - bytes_read));
- if (num_bytes <= 0)
- break;
- bytes_read += num_bytes;
+ int rv = HANDLE_EINTR(poll(poll_fds, 1,
+ TestTimeouts::action_max_timeout_ms()));
+ if (rv != 1) {
+ LOG(ERROR) << "Failed to poll for the child file descriptor.";
+ return false;
}
+ char buf[8];
+ ssize_t n = HANDLE_EINTR(read(child_fd_, buf, sizeof(buf)));
// We don't need the FD anymore.
child_fd_closer_.reset(NULL);
- if (bytes_read < bytes_max)
- return false;
- host_port_pair_.set_port(port);
- return true;
+ return n > 0;
}
bool TestServer::CheckCATrusted() {
diff --git a/net/test/test_server_win.cc b/net/test/test_server_win.cc
index 64437cd..c6e10d5 100644
--- a/net/test/test_server_win.cc
+++ b/net/test/test_server_win.cc
@@ -156,20 +156,11 @@ bool TestServer::WaitToStart() {
NewRunnableFunction(UnblockPipe, child_write_fd_.Get(), &unblocked),
TestTimeouts::action_max_timeout_ms());
- // Try to read two bytes from the pipe indicating the ephemeral port number.
- uint16 port;
- uint8* buffer = reinterpret_cast<uint8*>(&port);
- DWORD bytes_read = 0;
- DWORD bytes_max = sizeof(port);
- while (bytes_read < bytes_max) {
- DWORD num_bytes;
- if (!ReadFile(child_read_fd_, buffer + bytes_read, bytes_max - bytes_read,
- &num_bytes, NULL))
- break;
- if (num_bytes <= 0)
- break;
- bytes_read += num_bytes;
- }
+ char buf[8];
+ DWORD bytes_read;
+ BOOL result = ReadFile(child_read_fd_.Get(), buf, sizeof(buf), &bytes_read,
+ NULL);
+
thread.Stop();
child_read_fd_.Close();
child_write_fd_.Close();
@@ -178,12 +169,7 @@ bool TestServer::WaitToStart() {
if (unblocked)
return false;
- // If not enough bytes were read, fail.
- if (bytes_read < bytes_max)
- return false;
-
- host_port_pair_.set_port(port);
- return true;
+ return result && bytes_read > 0;
}
bool TestServer::CheckCATrusted() {
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py
index 0e1445b..55aa6a9 100755
--- a/net/tools/testserver/testserver.py
+++ b/net/tools/testserver/testserver.py
@@ -6,9 +6,7 @@
"""This is a simple HTTP server used for testing Chrome.
It supports several test URLs, as specified by the handlers in TestPageHandler.
-By default, it listens on an ephemeral port and sends the port number back to
-the originating process over a pipe. The originating process can specify an
-explicit port if necessary.
+It defaults to living on localhost:8888.
It can use https if you specify the flag --https=CERT where CERT is the path
to a pem file containing the certificate and private key that should be used.
"""
@@ -22,7 +20,6 @@ import re
import shutil
import SocketServer
import sys
-import struct
import time
import urlparse
import warnings
@@ -503,7 +500,7 @@ class TestPageHandler(BaseHTTPServer.BaseHTTPRequestHandler):
'pre { border: 1px solid black; margin: 5px; padding: 5px }'
'</style></head><body>'
'<div style="float: right">'
- '<a href="/echo">back to referring page</a></div>'
+ '<a href="http://localhost:8888/echo">back to referring page</a></div>'
'<h1>Request Body:</h1><pre>')
if self.command == 'POST' or self.command == 'PUT':
@@ -1194,15 +1191,15 @@ def main(options, args):
server = HTTPSServer(('127.0.0.1', port), TestPageHandler, options.cert,
options.ssl_client_auth, options.ssl_client_ca,
options.ssl_bulk_cipher)
- print 'HTTPS server started on port %d...' % server.server_port
+ print 'HTTPS server started on port %d...' % port
else:
server = StoppableHTTPServer(('127.0.0.1', port), TestPageHandler)
- print 'HTTP server started on port %d...' % server.server_port
+ print 'HTTP server started on port %d...' % port
server.data_dir = MakeDataDir()
server.file_root_url = options.file_root_url
server._sync_handler = None
- listen_port = server.server_port
+
# means FTP Server
else:
my_data_dir = MakeDataDir()
@@ -1227,8 +1224,7 @@ def main(options, args):
# Instantiate FTP server class and listen to 127.0.0.1:port
address = ('127.0.0.1', port)
server = pyftpdlib.ftpserver.FTPServer(address, ftp_handler)
- listen_port = server.socket.getsockname()[1]
- print 'FTP server started on port %d...' % listen_port
+ print 'FTP server started on port %d...' % port
# Notify the parent that we've started. (BaseServer subclasses
# bind their sockets on construction.)
@@ -1238,10 +1234,7 @@ def main(options, args):
else:
fd = options.startup_pipe
startup_pipe = os.fdopen(fd, "w")
- # Write the listening port as a 2 byte value. This is _not_ using
- # network byte ordering since the other end of the pipe is on the same
- # machine.
- startup_pipe.write(struct.pack('@H', listen_port))
+ startup_pipe.write("READY")
startup_pipe.close()
try:
@@ -1256,9 +1249,8 @@ if __name__ == '__main__':
const=SERVER_FTP, default=SERVER_HTTP,
dest='server_type',
help='FTP or HTTP server: default is HTTP.')
- option_parser.add_option('', '--port', default='0', type='int',
- help='Port used by the server. If unspecified, the '
- 'server will listen on an ephemeral port.')
+ option_parser.add_option('', '--port', default='8888', type='int',
+ help='Port used by the server.')
option_parser.add_option('', '--data-dir', dest='data_dir',
help='Directory from which to read the files.')
option_parser.add_option('', '--https', dest='cert',