| Index: base/process_util_unittest.cc
|
| diff --git a/base/process_util_unittest.cc b/base/process_util_unittest.cc
|
| index 7b30be6590ccf321361e79de7b911517c04cb375..23e33ee92817d8c4070b7212c0041a39d97d0341 100644
|
| --- a/base/process_util_unittest.cc
|
| +++ b/base/process_util_unittest.cc
|
| @@ -27,6 +27,11 @@
|
| namespace base {
|
|
|
| class ProcessUtilTest : public MultiProcessTest {
|
| +#if defined(OS_POSIX)
|
| + public:
|
| + // Spawn a child process that counts how many file descriptors are open.
|
| + int CountOpenFDsInChild();
|
| +#endif
|
| };
|
|
|
| MULTIPROCESS_TEST_MAIN(SimpleChildProcess) {
|
| @@ -200,14 +205,6 @@ MULTIPROCESS_TEST_MAIN(ProcessUtilsLeakFDChildProcess) {
|
| }
|
| }
|
|
|
| - // InitLogging always opens a file at startup.
|
| - int expected_num_open_fds = 1;
|
| -#if defined(OS_LINUX)
|
| - // On Linux, '/etc/localtime' is opened before the test's main() enters.
|
| - expected_num_open_fds += 1;
|
| -#endif // defined(OS_LINUX)
|
| - num_open_files -= expected_num_open_fds;
|
| -
|
| int written = HANDLE_EINTR(write(write_pipe, &num_open_files,
|
| sizeof(num_open_files)));
|
| DCHECK_EQ(static_cast<size_t>(written), sizeof(num_open_files));
|
| @@ -216,40 +213,45 @@ MULTIPROCESS_TEST_MAIN(ProcessUtilsLeakFDChildProcess) {
|
| return 0;
|
| }
|
|
|
| -TEST_F(ProcessUtilTest, FDRemapping) {
|
| - // Open some files to check they don't get leaked to the child process.
|
| +int ProcessUtilTest::CountOpenFDsInChild() {
|
| int fds[2];
|
| if (pipe(fds) < 0)
|
| NOTREACHED();
|
| - int pipe_read_fd = fds[0];
|
| - int pipe_write_fd = fds[1];
|
| -
|
| - // open some dummy fds to make sure they don't propogate over to the
|
| - // child process.
|
| - int dev_null = open("/dev/null", O_RDONLY);
|
| - int sockets[2];
|
| - socketpair(AF_UNIX, SOCK_STREAM, 0, sockets);
|
|
|
| file_handle_mapping_vector fd_mapping_vec;
|
| - fd_mapping_vec.push_back(std::pair<int,int>(pipe_write_fd, kChildPipe));
|
| + fd_mapping_vec.push_back(std::pair<int,int>(fds[1], kChildPipe));
|
| ProcessHandle handle = this->SpawnChild(L"ProcessUtilsLeakFDChildProcess",
|
| fd_mapping_vec,
|
| false);
|
| - ASSERT_NE(static_cast<ProcessHandle>(NULL), handle);
|
| - HANDLE_EINTR(close(pipe_write_fd));
|
| + CHECK(static_cast<ProcessHandle>(NULL) != handle);
|
| + HANDLE_EINTR(close(fds[1]));
|
|
|
| // Read number of open files in client process from pipe;
|
| int num_open_files = -1;
|
| ssize_t bytes_read =
|
| - HANDLE_EINTR(read(pipe_read_fd, &num_open_files, sizeof(num_open_files)));
|
| - ASSERT_EQ(bytes_read, static_cast<ssize_t>(sizeof(num_open_files)));
|
| -
|
| - // Make sure 0 fds are leaked to the client.
|
| - ASSERT_EQ(0, num_open_files);
|
| + HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files)));
|
| + CHECK(bytes_read == static_cast<ssize_t>(sizeof(num_open_files)));
|
|
|
| - EXPECT_TRUE(WaitForSingleProcess(handle, 1000));
|
| + CHECK(WaitForSingleProcess(handle, 1000));
|
| base::CloseProcessHandle(handle);
|
| HANDLE_EINTR(close(fds[0]));
|
| +
|
| + return num_open_files;
|
| +}
|
| +
|
| +TEST_F(ProcessUtilTest, FDRemapping) {
|
| + int fds_before = CountOpenFDsInChild();
|
| +
|
| + // open some dummy fds to make sure they don't propogate over to the
|
| + // child process.
|
| + int dev_null = open("/dev/null", O_RDONLY);
|
| + int sockets[2];
|
| + socketpair(AF_UNIX, SOCK_STREAM, 0, sockets);
|
| +
|
| + int fds_after = CountOpenFDsInChild();
|
| +
|
| + ASSERT_EQ(fds_after, fds_before);
|
| +
|
| HANDLE_EINTR(close(sockets[0]));
|
| HANDLE_EINTR(close(sockets[1]));
|
| HANDLE_EINTR(close(dev_null));
|
|
|