summaryrefslogtreecommitdiffstats
path: root/net/test
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-11 20:31:31 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-11 20:31:31 +0000
commitfd6cfaf721f4da81f4fb19983b73f96c1005f0d8 (patch)
treee85638342ec6e69f72eee8522f4127dcd5dfbfe5 /net/test
parent09c1973dd93208a0d1d96c8b095dcf9c7cb10043 (diff)
downloadchromium_src-fd6cfaf721f4da81f4fb19983b73f96c1005f0d8.zip
chromium_src-fd6cfaf721f4da81f4fb19983b73f96c1005f0d8.tar.gz
chromium_src-fd6cfaf721f4da81f4fb19983b73f96c1005f0d8.tar.bz2
testserver.py listens on ephemeral ports by default.
If --port is specified on the command line, testserver.py will listen on that port, otherwise it will listen on an ephemeral port. If --startup_pipe is specified, the port number is written to the pipe as a 2 byte unsigned int in host order. TestServer spawns testserver.py to listen on an ephemeral port and reads the port value from the pipe. A fixed port can not be specified. BUG=56814 TEST=try bots pass Review URL: http://codereview.chromium.org/4733005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65843 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/test')
-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
4 files changed, 76 insertions, 77 deletions
diff --git a/net/test/test_server.cc b/net/test/test_server.cc
index 5d197b9..9a89cc9 100644
--- a/net/test/test_server.cc
+++ b/net/test/test_server.cc
@@ -41,59 +41,6 @@ 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 &&
@@ -139,13 +86,16 @@ FilePath TestServer::HTTPSOptions::GetCertificateFile() const {
}
TestServer::TestServer(Type type, const FilePath& document_root)
- : type_(type) {
+ : type_(type),
+ started_(false) {
Init(document_root);
}
TestServer::TestServer(const HTTPSOptions& https_options,
const FilePath& document_root)
- : https_options_(https_options), type_(TYPE_HTTPS) {
+ : https_options_(https_options),
+ type_(TYPE_HTTPS),
+ started_(false) {
Init(document_root);
}
@@ -157,8 +107,11 @@ TestServer::~TestServer() {
}
void TestServer::Init(const FilePath& document_root) {
- host_port_pair_ = HostPortPair(GetHostname(type_, https_options_),
- GetPort(type_, https_options_));
+ // 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);
process_handle_ = base::kNullProcessHandle;
FilePath src_dir;
@@ -203,6 +156,7 @@ bool TestServer::Start() {
return false;
}
+ started_ = true;
return true;
}
@@ -210,6 +164,8 @@ 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)
@@ -225,6 +181,11 @@ 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 b92c91d..b639094 100644
--- a/net/test/test_server.h
+++ b/net/test/test_server.h
@@ -114,7 +114,7 @@ class TestServer {
bool Stop();
const FilePath& document_root() const { return document_root_; }
- const HostPortPair& host_port_pair() const { return host_port_pair_; }
+ const HostPortPair& host_port_pair() const;
std::string GetScheme() const;
bool GetAddressList(AddressList* address_list) const WARN_UNUSED_RESULT;
@@ -196,6 +196,9 @@ 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 707eb93..9c0210b 100644
--- a/net/test/test_server_posix.cc
+++ b/net/test/test_server_posix.cc
@@ -98,24 +98,45 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) {
}
bool TestServer::WaitToStart() {
- struct pollfd poll_fds[1];
-
- poll_fds[0].fd = child_fd_;
- poll_fds[0].events = POLLIN | POLLPRI;
- poll_fds[0].revents = 0;
+ 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;
+ }
- 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;
+ 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;
}
- 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);
- return n > 0;
+ if (bytes_read < bytes_max)
+ return false;
+ host_port_pair_.set_port(port);
+ return true;
}
bool TestServer::CheckCATrusted() {
diff --git a/net/test/test_server_win.cc b/net/test/test_server_win.cc
index c6e10d5..64437cd 100644
--- a/net/test/test_server_win.cc
+++ b/net/test/test_server_win.cc
@@ -156,11 +156,20 @@ bool TestServer::WaitToStart() {
NewRunnableFunction(UnblockPipe, child_write_fd_.Get(), &unblocked),
TestTimeouts::action_max_timeout_ms());
- char buf[8];
- DWORD bytes_read;
- BOOL result = ReadFile(child_read_fd_.Get(), buf, sizeof(buf), &bytes_read,
- NULL);
-
+ // 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;
+ }
thread.Stop();
child_read_fd_.Close();
child_write_fd_.Close();
@@ -169,7 +178,12 @@ bool TestServer::WaitToStart() {
if (unblocked)
return false;
- return result && bytes_read > 0;
+ // If not enough bytes were read, fail.
+ if (bytes_read < bytes_max)
+ return false;
+
+ host_port_pair_.set_port(port);
+ return true;
}
bool TestServer::CheckCATrusted() {