diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-27 01:52:52 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-27 01:52:52 +0000 |
commit | b2cc96d0f23779ed8b2491227d13cc8f984f4585 (patch) | |
tree | 358b4d0ffa7ff1aa273411a1ed5350cffbaf1697 /net | |
parent | 893d7214c49df970ed4abfc69060a48c9b880b22 (diff) | |
download | chromium_src-b2cc96d0f23779ed8b2491227d13cc8f984f4585.zip chromium_src-b2cc96d0f23779ed8b2491227d13cc8f984f4585.tar.gz chromium_src-b2cc96d0f23779ed8b2491227d13cc8f984f4585.tar.bz2 |
Made testserver communicate to parent process with JSON
This is so that if the testserver needs to communicate anything more than
the port in the future (e.g., xmpp port for the test sync server), it
can do so in a flexible manner.
BUG=53934
TEST=manually
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=66879
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=67018
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=67386
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=67398
Review URL: http://codereview.chromium.org/5196001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67481 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-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: |