diff options
Diffstat (limited to 'net/test/test_server_win.cc')
-rw-r--r-- | net/test/test_server_win.cc | 87 |
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; } |