diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/test/test_server.cc | 32 | ||||
-rw-r--r-- | net/test/test_server.h | 4 | ||||
-rw-r--r-- | net/test/test_server_posix.cc | 85 | ||||
-rw-r--r-- | net/test/test_server_win.cc | 87 | ||||
-rwxr-xr-x | net/tools/testserver/testserver.py | 22 |
5 files changed, 71 insertions, 159 deletions
diff --git a/net/test/test_server.cc b/net/test/test_server.cc index 1fd20c9..0e8c461 100644 --- a/net/test/test_server.cc +++ b/net/test/test_server.cc @@ -17,14 +17,11 @@ #include "base/base64.h" #include "base/command_line.h" #include "base/debug/leak_annotations.h" -#include "base/json/json_reader.h" #include "base/file_util.h" #include "base/logging.h" #include "base/path_service.h" -#include "base/scoped_ptr.h" #include "base/string_number_conversions.h" #include "base/utf_string_conversions.h" -#include "base/values.h" #include "googleurl/src/gurl.h" #include "net/base/cert_test_util.h" #include "net/base/host_port_pair.h" @@ -281,11 +278,6 @@ bool TestServer::SetPythonPath() { } third_party_dir = third_party_dir.Append(FILE_PATH_LITERAL("third_party")); - // For simplejson. (simplejson, unlike all the other python modules - // we include, doesn't have an extra 'simplejson' directory, so we - // need to include its parent directory, i.e. third_party_dir). - AppendToPythonPath(third_party_dir); - AppendToPythonPath(third_party_dir.Append(FILE_PATH_LITERAL("tlslite"))); AppendToPythonPath(third_party_dir.Append(FILE_PATH_LITERAL("pyftpdlib"))); @@ -381,28 +373,4 @@ bool TestServer::AddCommandLineArguments(CommandLine* command_line) const { return true; } -bool TestServer::ParseServerData(const std::string& server_data) { - VLOG(1) << "Server data: " << server_data; - base::JSONReader json_reader; - scoped_ptr<Value> value(json_reader.JsonToValue(server_data, true, false)); - if (!value.get() || - !value->IsType(Value::TYPE_DICTIONARY)) { - LOG(ERROR) << "Could not parse server data: " - << json_reader.GetErrorMessage(); - return false; - } - DictionaryValue* dict = static_cast<DictionaryValue*>(value.get()); - int port = 0; - if (!dict->GetInteger("port", &port)) { - LOG(ERROR) << "Could not find port value"; - return false; - } - if ((port <= 0) || (port >= kuint16max)) { - LOG(ERROR) << "Invalid port value: " << port; - return false; - } - host_port_pair_.set_port(port); - return true; -} - } // namespace net diff --git a/net/test/test_server.h b/net/test/test_server.h index 5c11038..f819365 100644 --- a/net/test/test_server.h +++ b/net/test/test_server.h @@ -146,10 +146,6 @@ class TestServer { // Waits for the server to start. Returns true on success. bool WaitToStart() WARN_UNUSED_RESULT; - // Parses the server data read from the test server. Returns true - // on success. - bool ParseServerData(const std::string& server_data) WARN_UNUSED_RESULT; - // Returns path to the root certificate. FilePath GetRootCertificatePath(); diff --git a/net/test/test_server_posix.cc b/net/test/test_server_posix.cc index 74dbcd4..9c0210b 100644 --- a/net/test/test_server_posix.cc +++ b/net/test/test_server_posix.cc @@ -53,42 +53,6 @@ class OrphanedTestServerFilter : public base::ProcessFilter { DISALLOW_COPY_AND_ASSIGN(OrphanedTestServerFilter); }; -// Given a file descriptor, reads into |buffer| until |bytes_max| -// bytes has been read or an error has been encountered. Returns true -// if the read was successful. |remaining_time| is used as a timeout. -bool ReadData(int fd, ssize_t bytes_max, uint8* buffer, - base::TimeDelta* remaining_time) { - ssize_t bytes_read = 0; - base::Time previous_time = base::Time::Now(); - while (bytes_read < bytes_max) { - struct pollfd poll_fds[1]; - - poll_fds[0].fd = 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; - } - - 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(fd, buffer + bytes_read, - bytes_max - bytes_read)); - if (num_bytes <= 0) - return false; - bytes_read += num_bytes; - } - return true; -} - } // namespace namespace net { @@ -134,22 +98,45 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) { } bool TestServer::WaitToStart() { - file_util::ScopedFD child_fd_closer(child_fd_closer_.release()); - + 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()); - uint32 server_data_len = 0; - if (!ReadData(child_fd_, sizeof(server_data_len), - reinterpret_cast<uint8*>(&server_data_len), - &remaining_time)) - return false; - std::string server_data(server_data_len, '\0'); - if (!ReadData(child_fd_, server_data_len, - reinterpret_cast<uint8*>(&server_data[0]), - &remaining_time)) - return false; + 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; + } - return ParseServerData(server_data); + 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; + } + + // 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; } bool TestServer::CheckCATrusted() { diff --git a/net/test/test_server_win.cc b/net/test/test_server_win.cc index 47a3c61..a363755 100644 --- a/net/test/test_server_win.cc +++ b/net/test/test_server_win.cc @@ -80,53 +80,12 @@ void UnblockPipe(HANDLE handle, bool* unblocked) { // Unblock the ReadFile in TestServer::WaitToStart by writing to the pipe. // Make sure the call succeeded, otherwise we are very likely to hang. DWORD bytes_written = 0; - LOG(WARNING) << "Timeout reached; unblocking pipe"; CHECK(WriteFile(handle, kUnblock, arraysize(kUnblock), &bytes_written, NULL)); CHECK_EQ(arraysize(kUnblock), bytes_written); *unblocked = true; } -// Given a file handle, reads into |buffer| until |bytes_max| bytes -// has been read or an error has been encountered. Returns -// true if the read was successful. -bool ReadData(HANDLE read_fd, HANDLE write_fd, - DWORD bytes_max, uint8* buffer) { - base::Thread thread("test_server_watcher"); - if (!thread.Start()) - return false; - - // Prepare a timeout in case the server fails to start. - bool unblocked = false; - thread.message_loop()->PostDelayedTask(FROM_HERE, - NewRunnableFunction(UnblockPipe, write_fd, &unblocked), - TestTimeouts::action_max_timeout_ms()); - - DWORD bytes_read = 0; - while (bytes_read < bytes_max) { - DWORD num_bytes; - if (!ReadFile(read_fd, buffer + bytes_read, bytes_max - bytes_read, - &num_bytes, NULL)) { - PLOG(ERROR) << "ReadFile failed"; - return false; - } - if (num_bytes <= 0) { - LOG(ERROR) << "ReadFile returned invalid byte count: " << num_bytes; - return false; - } - bytes_read += num_bytes; - } - - thread.Stop(); - // If the timeout kicked in, abort. - if (unblocked) { - LOG(ERROR) << "Timeout exceeded for ReadData"; - return false; - } - - return true; -} - } // namespace namespace net { @@ -187,27 +146,43 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) { } bool TestServer::WaitToStart() { - ScopedHandle read_fd(child_read_fd_.Take()); - ScopedHandle write_fd(child_write_fd_.Take()); - - uint32 server_data_len = 0; - if (!ReadData(read_fd.Get(), write_fd.Get(), sizeof(server_data_len), - reinterpret_cast<uint8*>(&server_data_len))) { - LOG(ERROR) << "Could not read server_data_len"; + base::Thread thread("test_server_watcher"); + if (!thread.Start()) return false; + + // Prepare a timeout in case the server fails to start. + bool unblocked = false; + thread.message_loop()->PostDelayedTask(FROM_HERE, + 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; } - std::string server_data(server_data_len, '\0'); - if (!ReadData(read_fd.Get(), write_fd.Get(), server_data_len, - reinterpret_cast<uint8*>(&server_data[0]))) { - LOG(ERROR) << "Could not read server_data of size " << server_data_len; + thread.Stop(); + child_read_fd_.Close(); + child_write_fd_.Close(); + + // If we hit the timeout, fail. + if (unblocked) return false; - } - if (!ParseServerData(server_data)) { - LOG(ERROR) << "Could not parse " << server_data; + // If not enough bytes were read, fail. + if (bytes_read < bytes_max) return false; - } + host_port_pair_.set_port(port); return true; } diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py index b69eb2f..2551139 100755 --- a/net/tools/testserver/testserver.py +++ b/net/tools/testserver/testserver.py @@ -27,13 +27,6 @@ import time import urlparse import warnings -# If we use simplejson always, we get some warnings when we run under -# 2.6. -if sys.version_info < (2, 6): - import simplejson as json -else: - import json - # Ignore deprecation warnings, they make our output more cluttered. warnings.filterwarnings("ignore", category=DeprecationWarning) @@ -1328,22 +1321,15 @@ def main(options, args): # Notify the parent that we've started. (BaseServer subclasses # bind their sockets on construction.) if options.startup_pipe is not None: - server_data = { - 'port': listen_port - } - server_data_json = json.dumps(server_data) - debug('sending server_data: %s' % server_data_json) - server_data_len = len(server_data_json) if sys.platform == 'win32': fd = msvcrt.open_osfhandle(options.startup_pipe, 0) else: fd = options.startup_pipe startup_pipe = os.fdopen(fd, "w") - # First write the data length as an unsigned 4-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('=L', server_data_len)) - startup_pipe.write(server_data_json) + # 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.close() try: |