| Index: chrome/common/ipc_send_fds_test.cc
|
| diff --git a/chrome/common/ipc_send_fds_test.cc b/chrome/common/ipc_send_fds_test.cc
|
| deleted file mode 100644
|
| index 24cc870e27d0146e7331d292a4e4abfe9d808407..0000000000000000000000000000000000000000
|
| --- a/chrome/common/ipc_send_fds_test.cc
|
| +++ /dev/null
|
| @@ -1,187 +0,0 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "build/build_config.h"
|
| -
|
| -#include "chrome/common/ipc_tests.h"
|
| -
|
| -#if defined(OS_MACOSX)
|
| -extern "C" {
|
| -#include <sandbox.h>
|
| -}
|
| -#endif
|
| -#include <fcntl.h>
|
| -#include <sys/stat.h>
|
| -
|
| -#include "base/eintr_wrapper.h"
|
| -#include "base/message_loop.h"
|
| -#include "chrome/common/ipc_channel.h"
|
| -#include "chrome/common/ipc_message_utils.h"
|
| -
|
| -#if defined(OS_POSIX)
|
| -
|
| -namespace {
|
| -
|
| -const unsigned kNumFDsToSend = 20;
|
| -const char* kDevZeroPath = "/dev/zero";
|
| -
|
| -static void VerifyAndCloseDescriptor(int fd, ino_t inode_num) {
|
| - // Check that we can read from the FD.
|
| - char buf;
|
| - ssize_t amt_read = read(fd, &buf, 1);
|
| - ASSERT_EQ(amt_read, 1);
|
| - ASSERT_EQ(buf, 0); // /dev/zero always reads NUL bytes.
|
| -
|
| - struct stat st;
|
| - ASSERT_EQ(fstat(fd, &st), 0);
|
| -
|
| - ASSERT_EQ(close(fd), 0);
|
| -
|
| - // We compare iNode numbers to check that the file sent over the wire
|
| - // was actually the same physical file as the one we were expecting.
|
| - ASSERT_EQ(inode_num, st.st_ino);
|
| -}
|
| -
|
| -class MyChannelDescriptorListener : public IPC::Channel::Listener {
|
| - public:
|
| - MyChannelDescriptorListener(ino_t expected_inode_num)
|
| - : expected_inode_num_(expected_inode_num),
|
| - num_fds_received_(0) {}
|
| -
|
| - virtual void OnMessageReceived(const IPC::Message& message) {
|
| - void* iter = NULL;
|
| -
|
| - ++num_fds_received_;
|
| - base::FileDescriptor descriptor;
|
| -
|
| - ASSERT_TRUE(
|
| - IPC::ParamTraits<base::FileDescriptor>::Read(
|
| - &message, &iter, &descriptor));
|
| -
|
| - VerifyAndCloseDescriptor(descriptor.fd, expected_inode_num_);
|
| - if (num_fds_received_ == kNumFDsToSend) {
|
| - MessageLoop::current()->Quit();
|
| - }
|
| - }
|
| -
|
| - virtual void OnChannelError() {
|
| - MessageLoop::current()->Quit();
|
| - }
|
| - private:
|
| - ino_t expected_inode_num_;
|
| - unsigned num_fds_received_;
|
| -};
|
| -
|
| -void TestDescriptorServer(IPC::Channel &chan,
|
| - base::ProcessHandle process_handle) {
|
| - ASSERT_TRUE(process_handle);
|
| -
|
| - for (unsigned i = 0; i < kNumFDsToSend; ++i) {
|
| - base::FileDescriptor descriptor;
|
| - const int fd = open(kDevZeroPath, O_RDONLY);
|
| - ASSERT_GE(fd, 0);
|
| - descriptor.auto_close = true;
|
| - descriptor.fd = fd;
|
| -
|
| - IPC::Message* message = new IPC::Message(0, // routing_id
|
| - 3, // message type
|
| - IPC::Message::PRIORITY_NORMAL);
|
| - IPC::ParamTraits<base::FileDescriptor>::Write(message, descriptor);
|
| - chan.Send(message);
|
| - }
|
| -
|
| - // Run message loop.
|
| - MessageLoop::current()->Run();
|
| -
|
| - // Close Channel so client gets its OnChannelError() callback fired.
|
| - chan.Close();
|
| -
|
| - // Cleanup child process.
|
| - EXPECT_TRUE(base::WaitForSingleProcess(process_handle, 5000));
|
| -}
|
| -
|
| -int TestDescriptorClient(ino_t expected_inode_num) {
|
| - MessageLoopForIO main_message_loop;
|
| - MyChannelDescriptorListener listener(expected_inode_num);
|
| -
|
| - // Setup IPC channel.
|
| - IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_CLIENT,
|
| - &listener);
|
| - chan.Connect();
|
| - MessageLoop::current()->Run();
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// ---------------------------------------------------------------------------
|
| -#if defined(OS_MACOSX)
|
| -// TODO(port): Make this test cross-platform.
|
| -MULTIPROCESS_TEST_MAIN(RunTestDescriptorClientSandboxed) {
|
| - struct stat st;
|
| - const int fd = open(kDevZeroPath, O_RDONLY);
|
| - fstat(fd, &st);
|
| - HANDLE_EINTR(close(fd));
|
| -
|
| - // Enable the Sandbox.
|
| - char* error_buff = NULL;
|
| - int error = sandbox_init(kSBXProfilePureComputation, SANDBOX_NAMED,
|
| - &error_buff);
|
| - bool success = (error == 0 && error_buff == NULL);
|
| - if (!success) {
|
| - return -1;
|
| - }
|
| -
|
| - sandbox_free_error(error_buff);
|
| -
|
| - // Make sure Sandbox is really enabled.
|
| - if (open(kDevZeroPath, O_RDONLY) != -1) {
|
| - LOG(ERROR) << "Sandbox wasn't properly enabled";
|
| - return -1;
|
| - }
|
| -
|
| - // See if we can receive a file descriptor.
|
| - return TestDescriptorClient(st.st_ino);
|
| -}
|
| -
|
| -// Test that FDs are correctly sent to a sandboxed process.
|
| -TEST_F(IPCChannelTest, DescriptorTestSandboxed) {
|
| - // Setup IPC channel.
|
| - MyChannelDescriptorListener listener(-1);
|
| -
|
| - IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER,
|
| - &listener);
|
| - chan.Connect();
|
| -
|
| - base::ProcessHandle process_handle = SpawnChild(
|
| - TEST_DESCRIPTOR_CLIENT_SANDBOXED,
|
| - &chan);
|
| - TestDescriptorServer(chan, process_handle);
|
| -}
|
| -#endif // defined(OS_MACOSX)
|
| -
|
| -MULTIPROCESS_TEST_MAIN(RunTestDescriptorClient) {
|
| - struct stat st;
|
| - const int fd = open(kDevZeroPath, O_RDONLY);
|
| - fstat(fd, &st);
|
| - HANDLE_EINTR(close(fd));
|
| -
|
| - return TestDescriptorClient(st.st_ino);
|
| -}
|
| -
|
| -TEST_F(IPCChannelTest, DescriptorTest) {
|
| - // Setup IPC channel.
|
| - MyChannelDescriptorListener listener(-1);
|
| -
|
| - IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER,
|
| - &listener);
|
| - chan.Connect();
|
| -
|
| - base::ProcessHandle process_handle = SpawnChild(TEST_DESCRIPTOR_CLIENT,
|
| - &chan);
|
| - TestDescriptorServer(chan, process_handle);
|
| -}
|
| -
|
| -#endif // defined(OS_POSIX)
|
|
|