diff options
author | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-11 23:23:12 +0000 |
---|---|---|
committer | agl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-11 23:23:12 +0000 |
commit | 9263944688de80b3ffe38bbc3c7a85124a2f4c92 (patch) | |
tree | f62465cd33c52696944de75c637973b456829153 /chrome | |
parent | 85e921fb8e323a9226215569d41a5ab7203d3aad (diff) | |
download | chromium_src-9263944688de80b3ffe38bbc3c7a85124a2f4c92.zip chromium_src-9263944688de80b3ffe38bbc3c7a85124a2f4c92.tar.gz chromium_src-9263944688de80b3ffe38bbc3c7a85124a2f4c92.tar.bz2 |
POSIX: Change FD passing test to send many messages
(This is mostly an adoption of Jeremy's patch.)
Also, switch from using /dev/random to /dev/zero. Reading from
/dev/random can drain the system entropy pool and block.
Review URL: http://codereview.chromium.org/21269
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9609 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/common/ipc_send_fds_test.cc | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/chrome/common/ipc_send_fds_test.cc b/chrome/common/ipc_send_fds_test.cc index e7cb207..a22de65 100644 --- a/chrome/common/ipc_send_fds_test.cc +++ b/chrome/common/ipc_send_fds_test.cc @@ -21,13 +21,15 @@ extern "C" { namespace { -const char* kDevRandomPath = "/dev/random"; +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); @@ -42,11 +44,13 @@ static void VerifyAndCloseDescriptor(int fd, ino_t inode_num) { class MyChannelDescriptorListener : public IPC::Channel::Listener { public: MyChannelDescriptorListener(ino_t expected_inode_num) - : expected_inode_num_(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( @@ -54,7 +58,9 @@ class MyChannelDescriptorListener : public IPC::Channel::Listener { &message, &iter, &descriptor)); VerifyAndCloseDescriptor(descriptor.fd, expected_inode_num_); - MessageLoop::current()->Quit(); + if (num_fds_received_ == kNumFDsToSend) { + MessageLoop::current()->Quit(); + } } virtual void OnChannelError() { @@ -62,23 +68,26 @@ class MyChannelDescriptorListener : public IPC::Channel::Listener { } private: ino_t expected_inode_num_; + unsigned num_fds_received_; }; void TestDescriptorServer(IPC::Channel &chan, base::ProcessHandle process_handle) { ASSERT_TRUE(process_handle); - base::FileDescriptor descriptor; - const int fd = open(kDevRandomPath, 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); + 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(); @@ -110,7 +119,7 @@ int TestDescriptorClient(ino_t expected_inode_num) { // TODO(port): Make this test cross-platform. MULTIPROCESS_TEST_MAIN(RunTestDescriptorClientSandboxed) { struct stat st; - const int fd = open(kDevRandomPath, O_RDONLY); + const int fd = open(kDevZeroPath, O_RDONLY); fstat(fd, &st); close(fd); @@ -126,7 +135,7 @@ MULTIPROCESS_TEST_MAIN(RunTestDescriptorClientSandboxed) { sandbox_free_error(error_buff); // Make sure Sandbox is really enabled. - if (open(kDevRandomPath, O_RDONLY) != -1) { + if (open(kDevZeroPath, O_RDONLY) != -1) { LOG(ERROR) << "Sandbox wasn't properly enabled"; return -1; } @@ -153,7 +162,7 @@ TEST_F(IPCChannelTest, DescriptorTestSandboxed) { MULTIPROCESS_TEST_MAIN(RunTestDescriptorClient) { struct stat st; - const int fd = open(kDevRandomPath, O_RDONLY); + const int fd = open(kDevZeroPath, O_RDONLY); fstat(fd, &st); close(fd); |