summaryrefslogtreecommitdiffstats
path: root/net/test/test_server_win.cc
diff options
context:
space:
mode:
authorakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-22 22:52:26 +0000
committerakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-22 22:52:26 +0000
commitd5dc41eebc137ac693a6ee1e527e927edd02ed28 (patch)
tree0b21967493f05ed032a7b5603a23102b319f1dd0 /net/test/test_server_win.cc
parent761862b098c1593e2d0397c6ab99004c7d488af4 (diff)
downloadchromium_src-d5dc41eebc137ac693a6ee1e527e927edd02ed28.zip
chromium_src-d5dc41eebc137ac693a6ee1e527e927edd02ed28.tar.gz
chromium_src-d5dc41eebc137ac693a6ee1e527e927edd02ed28.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 Review URL: http://codereview.chromium.org/5196001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67018 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/test/test_server_win.cc')
-rw-r--r--net/test/test_server_win.cc71
1 files changed, 48 insertions, 23 deletions
diff --git a/net/test/test_server_win.cc b/net/test/test_server_win.cc
index 64437cd..530f8c4 100644
--- a/net/test/test_server_win.cc
+++ b/net/test/test_server_win.cc
@@ -86,6 +86,35 @@ void UnblockPipe(HANDLE handle, bool* unblocked) {
*unblocked = true;
}
+// Given a file handle, reads into |buffer| until |bytes_max| bytes
+// has been read or an error has been encountered (which includes
+// |unblocked| being set to true; see UnblockPipe() above). Returns
+// true if the read was successful.
+bool ReadData(bool* unblocked, HANDLE fd, DWORD bytes_max, uint8* buffer) {
+ DWORD bytes_read = 0;
+ while (bytes_read < bytes_max) {
+ DWORD num_bytes;
+ if (!ReadFile(fd, buffer + bytes_read, bytes_max - bytes_read,
+ &num_bytes, NULL)) {
+ LOG(ERROR) << "ReadFile failed while reading " << bytes_max
+ << " bytes";
+ return false;
+ }
+ if (num_bytes <= 0) {
+ LOG(ERROR) << "Error while reading " << bytes_max
+ << " bytes";
+ return false;
+ }
+ if (*unblocked) {
+ LOG(ERROR) << "Timeout exceeded while reading " << bytes_max
+ << " bytes";
+ return false;
+ }
+ bytes_read += num_bytes;
+ }
+ return true;
+}
+
} // namespace
namespace net {
@@ -146,6 +175,9 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) {
}
bool TestServer::WaitToStart() {
+ ScopedHandle read_fd(child_read_fd_.Take());
+ ScopedHandle write_fd(child_write_fd_.Take());
+
base::Thread thread("test_server_watcher");
if (!thread.Start())
return false;
@@ -153,36 +185,29 @@ bool TestServer::WaitToStart() {
// 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),
+ NewRunnableFunction(UnblockPipe, 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;
+ uint32 server_data_len = 0;
+ if (!ReadData(&unblocked, read_fd.Get(), sizeof(server_data_len),
+ reinterpret_cast<uint8*>(&server_data_len))) {
+ LOG(ERROR) << "Could not read server data length";
+ return false;
}
- thread.Stop();
- child_read_fd_.Close();
- child_write_fd_.Close();
-
- // If we hit the timeout, fail.
- if (unblocked)
+ std::string server_data(server_data_len, '\0');
+ if (!ReadData(&unblocked, read_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 not enough bytes were read, fail.
- if (bytes_read < bytes_max)
+ if (!ParseServerData(server_data)) {
+ LOG(ERROR) << "Could not parse server data from "
+ << server_data;
return false;
+ }
- host_port_pair_.set_port(port);
return true;
}