diff options
-rw-r--r-- | net/test/test_server.cc | 27 | ||||
-rw-r--r-- | net/test/test_server.h | 4 | ||||
-rw-r--r-- | net/test/test_server_posix.cc | 24 | ||||
-rw-r--r-- | net/test/test_server_win.cc | 22 | ||||
-rwxr-xr-x | net/tools/testserver/testserver.py | 13 |
5 files changed, 74 insertions, 16 deletions
diff --git a/net/test/test_server.cc b/net/test/test_server.cc index 1ae2c5b..1fd20c9 100644 --- a/net/test/test_server.cc +++ b/net/test/test_server.cc @@ -17,11 +17,14 @@ #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" @@ -378,4 +381,28 @@ 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 f819365..5c11038 100644 --- a/net/test/test_server.h +++ b/net/test/test_server.h @@ -146,6 +146,10 @@ 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 f9c594d..43bdb10 100644 --- a/net/test/test_server_posix.cc +++ b/net/test/test_server_posix.cc @@ -139,15 +139,27 @@ bool TestServer::WaitToStart() { base::TimeDelta remaining_time = base::TimeDelta::FromMilliseconds( TestTimeouts::action_max_timeout_ms()); - // Try to read two bytes from the pipe indicating the ephemeral port number. - uint16 port = 0; - if (!ReadData(child_fd_, sizeof(port), - reinterpret_cast<uint8*>(&port), &remaining_time)) { - LOG(ERROR) << "Could not read port"; + uint32 server_data_len = 0; + if (!ReadData(child_fd_, sizeof(server_data_len), + reinterpret_cast<uint8*>(&server_data_len), + &remaining_time)) { + LOG(ERROR) << "Could not read server_data_len"; + 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)) { + LOG(ERROR) << "Could not read server_data (" << server_data_len + << " bytes)"; + return false; + } + + if (!ParseServerData(server_data)) { + LOG(ERROR) << "Could not parse server_data: " << server_data; return false; } - host_port_pair_.set_port(port); return true; } diff --git a/net/test/test_server_win.cc b/net/test/test_server_win.cc index 79eb8dd..e1c54e9 100644 --- a/net/test/test_server_win.cc +++ b/net/test/test_server_win.cc @@ -194,15 +194,25 @@ bool TestServer::WaitToStart() { ScopedHandle read_fd(child_read_fd_.Take()); ScopedHandle write_fd(child_write_fd_.Take()); - // Try to read two bytes from the pipe indicating the ephemeral port number. - uint16 port = 0; - if (!ReadData(read_fd.Get(), write_fd.Get(), sizeof(port), - reinterpret_cast<uint8*>(&port))) { - LOG(ERROR) << "Could not read port"; + 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"; + return false; + } + 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 (" << server_data_len + << " bytes)"; + return false; + } + + if (!ParseServerData(server_data)) { + LOG(ERROR) << "Could not parse server_data: " << server_data; 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 e3e1176..7ce8123 100755 --- a/net/tools/testserver/testserver.py +++ b/net/tools/testserver/testserver.py @@ -49,6 +49,7 @@ SERVER_HTTP = 0 SERVER_FTP = 1 SERVER_SYNC = 2 +# Using debug() seems to cause hangs on XP: see http://crbug.com/64515 . debug_output = sys.stderr def debug(str): debug_output.write(str + "\n") @@ -1326,15 +1327,19 @@ def main(options, args): 'port': listen_port } server_data_json = simplejson.dumps(server_data) + server_data_len = len(server_data_json) + print 'sending server_data: %s (%d bytes)' % ( + server_data_json, server_data_len) if sys.platform == 'win32': fd = msvcrt.open_osfhandle(options.startup_pipe, 0) 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)) + # 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) startup_pipe.close() try: |