Chromium Code Reviews| Index: net/test/test_server_posix.cc |
| diff --git a/net/test/test_server_posix.cc b/net/test/test_server_posix.cc |
| index 9c0210b7d28429901ffec57384e7e3f6a7fc3c95..ec7b36713b023e0ce8681fe008f9bede9c67822a 100644 |
| --- a/net/test/test_server_posix.cc |
| +++ b/net/test/test_server_posix.cc |
| @@ -53,6 +53,42 @@ class OrphanedTestServerFilter : public base::ProcessFilter { |
| DISALLOW_COPY_AND_ASSIGN(OrphanedTestServerFilter); |
| }; |
| +// Given a file descriptor, reads into |buffer| until |bytes_max| |
| +// bytes has been read or an error has been encountered. Returns true |
| +// if the read was successful. |remaining_time| is used as a timeout. |
| +bool ReadData(base::TimeDelta* remaining_time, |
|
cbentzel
2010/11/19 14:54:57
Nit: remaining_time is an input/output argument. A
akalin
2010/11/19 16:45:28
Done.
|
| + int fd, ssize_t bytes_max, uint8* buffer) { |
| + ssize_t bytes_read = 0; |
| + base::Time previous_time = base::Time::Now(); |
| + while (bytes_read < bytes_max) { |
| + struct pollfd poll_fds[1]; |
| + |
| + poll_fds[0].fd = fd; |
| + poll_fds[0].events = POLLIN | POLLPRI; |
| + poll_fds[0].revents = 0; |
| + |
| + int rv = HANDLE_EINTR(poll(poll_fds, 1, |
| + remaining_time->InMilliseconds())); |
| + if (rv != 1) { |
| + LOG(ERROR) << "Failed to poll for the child file descriptor."; |
| + return false; |
| + } |
| + |
| + base::Time current_time = base::Time::Now(); |
| + base::TimeDelta elapsed_time_cycle = current_time - previous_time; |
| + DCHECK(elapsed_time_cycle.InMilliseconds() >= 0); |
| + *remaining_time -= elapsed_time_cycle; |
| + previous_time = current_time; |
| + |
| + ssize_t num_bytes = HANDLE_EINTR(read(fd, buffer + bytes_read, |
| + bytes_max - bytes_read)); |
| + if (num_bytes <= 0) |
| + return false; |
| + bytes_read += num_bytes; |
| + } |
| + return true; |
| +} |
| + |
| } // namespace |
| namespace net { |
| @@ -98,45 +134,20 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) { |
| } |
| bool TestServer::WaitToStart() { |
| - uint16 port; |
| - uint8* buffer = reinterpret_cast<uint8*>(&port); |
| - ssize_t bytes_read = 0; |
| - ssize_t bytes_max = sizeof(port); |
| + file_util::ScopedFD child_fd_closer(child_fd_closer_.release()); |
| + |
| base::TimeDelta remaining_time = base::TimeDelta::FromMilliseconds( |
| TestTimeouts::action_max_timeout_ms()); |
| - base::Time previous_time = base::Time::Now(); |
| - while (bytes_read < bytes_max) { |
| - struct pollfd poll_fds[1]; |
| - |
| - poll_fds[0].fd = child_fd_; |
| - poll_fds[0].events = POLLIN | POLLPRI; |
| - poll_fds[0].revents = 0; |
| - |
| - int rv = HANDLE_EINTR(poll(poll_fds, 1, remaining_time.InMilliseconds())); |
| - if (rv != 1) { |
| - LOG(ERROR) << "Failed to poll for the child file descriptor."; |
| - return false; |
| - } |
| - |
| - base::Time current_time = base::Time::Now(); |
| - base::TimeDelta elapsed_time_cycle = current_time - previous_time; |
| - DCHECK(elapsed_time_cycle.InMilliseconds() >= 0); |
| - remaining_time -= elapsed_time_cycle; |
| - previous_time = current_time; |
| - |
| - ssize_t num_bytes = HANDLE_EINTR(read(child_fd_, buffer + bytes_read, |
| - bytes_max - bytes_read)); |
| - if (num_bytes <= 0) |
| - break; |
| - bytes_read += num_bytes; |
| - } |
| - |
| - // We don't need the FD anymore. |
| - child_fd_closer_.reset(NULL); |
| - if (bytes_read < bytes_max) |
| + uint32 server_data_len = 0; |
| + if (!ReadData(&remaining_time, child_fd_, sizeof(server_data_len), |
| + reinterpret_cast<uint8*>(&server_data_len))) |
| return false; |
| - host_port_pair_.set_port(port); |
| - return true; |
| + std::string server_data(server_data_len, '\0'); |
| + if (!ReadData(&remaining_time, child_fd_, server_data_len, |
| + reinterpret_cast<uint8*>(&server_data[0]))) |
| + return false; |
| + |
| + return ParseServerData(server_data); |
| } |
| bool TestServer::CheckCATrusted() { |