summaryrefslogtreecommitdiffstats
path: root/net/test/test_server_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/test/test_server_win.cc')
-rw-r--r--net/test/test_server_win.cc87
1 files changed, 56 insertions, 31 deletions
diff --git a/net/test/test_server_win.cc b/net/test/test_server_win.cc
index a363755..47a3c61 100644
--- a/net/test/test_server_win.cc
+++ b/net/test/test_server_win.cc
@@ -80,12 +80,53 @@ 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 {
@@ -146,43 +187,27 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) {
}
bool TestServer::WaitToStart() {
- base::Thread thread("test_server_watcher");
- if (!thread.Start())
- return false;
+ ScopedHandle read_fd(child_read_fd_.Take());
+ ScopedHandle write_fd(child_write_fd_.Take());
- // 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;
+ 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;
}
- 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(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;
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;
return false;
+ }
- host_port_pair_.set_port(port);
return true;
}