diff options
-rw-r--r-- | chrome/chrome.xcodeproj/project.pbxproj | 4 | ||||
-rw-r--r-- | chrome/common/ipc_send_fds_test.cc | 95 | ||||
-rw-r--r-- | chrome/common/ipc_tests.cc | 96 | ||||
-rw-r--r-- | chrome/common/ipc_tests.scons | 1 |
4 files changed, 111 insertions, 85 deletions
diff --git a/chrome/chrome.xcodeproj/project.pbxproj b/chrome/chrome.xcodeproj/project.pbxproj index d7c8fe2..c56d960 100644 --- a/chrome/chrome.xcodeproj/project.pbxproj +++ b/chrome/chrome.xcodeproj/project.pbxproj @@ -301,6 +301,7 @@ B562E2F80F05843C00FB1A4F /* property_bag.cc in Sources */ = {isa = PBXBuildFile; fileRef = B562E2F60F05843C00FB1A4F /* property_bag.cc */; }; B562E2FC0F05845100FB1A4F /* property_bag_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B562E2F40F05843C00FB1A4F /* property_bag_unittest.cc */; }; B56E281B0F057F2800447108 /* message_router.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFBD10E9D4C9F009A6919 /* message_router.cc */; }; + B58331850F40FE4E00FABC29 /* ipc_send_fds_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = B58331690F40FC1F00FABC29 /* ipc_send_fds_test.cc */; }; B5D030F00F3A3C43001238AB /* renderer_main_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B5D030EF0F3A3C43001238AB /* renderer_main_unittest.cc */; }; B5D031270F3A4009001238AB /* ipc_sync_channel_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFBB80E9D4C9F009A6919 /* ipc_sync_channel_unittest.cc */; }; B5DBEA900EFC60E200C95176 /* ipc_channel_proxy.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D7BFBAB0E9D4C9F009A6919 /* ipc_channel_proxy.cc */; }; @@ -2358,6 +2359,7 @@ B562E2F40F05843C00FB1A4F /* property_bag_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = property_bag_unittest.cc; sourceTree = "<group>"; }; B562E2F50F05843C00FB1A4F /* property_bag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = property_bag.h; sourceTree = "<group>"; }; B562E2F60F05843C00FB1A4F /* property_bag.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = property_bag.cc; sourceTree = "<group>"; }; + B58331690F40FC1F00FABC29 /* ipc_send_fds_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ipc_send_fds_test.cc; sourceTree = "<group>"; }; B5D030EF0F3A3C43001238AB /* renderer_main_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = renderer_main_unittest.cc; sourceTree = "<group>"; }; B5D16EAB0F21445600861FAC /* ie7_password.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ie7_password.cc; path = password_manager/ie7_password.cc; sourceTree = "<group>"; }; B5D16EAC0F21445600861FAC /* encryptor.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = encryptor.cc; path = password_manager/encryptor.cc; sourceTree = "<group>"; }; @@ -3498,6 +3500,7 @@ 4D7BFBB30E9D4C9F009A6919 /* ipc_message_unittest.cc */, 4D7BFBB40E9D4C9F009A6919 /* ipc_message_utils.cc */, 4D7BFBB50E9D4C9F009A6919 /* ipc_message_utils.h */, + B58331690F40FC1F00FABC29 /* ipc_send_fds_test.cc */, 4D7BFBB60E9D4C9F009A6919 /* ipc_sync_channel.cc */, 4D7BFBB70E9D4C9F009A6919 /* ipc_sync_channel.h */, 4D7BFBB80E9D4C9F009A6919 /* ipc_sync_channel_unittest.cc */, @@ -5343,6 +5346,7 @@ files = ( E4F325C80EE83A45002533CE /* ipc_fuzzing_tests.cc in Sources */, E4F325850EE836F2002533CE /* ipc_message_unittest.cc in Sources */, + B58331850F40FE4E00FABC29 /* ipc_send_fds_test.cc in Sources */, E4F325D10EE83B71002533CE /* ipc_tests.cc in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/chrome/common/ipc_send_fds_test.cc b/chrome/common/ipc_send_fds_test.cc new file mode 100644 index 0000000..2c31f01 --- /dev/null +++ b/chrome/common/ipc_send_fds_test.cc @@ -0,0 +1,95 @@ +// 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" + +#include <sys/stat.h> + +#include "base/message_loop.h" +#include "chrome/common/ipc_channel.h" +#include "chrome/common/ipc_message_utils.h" + +#if defined(OS_POSIX) + +class MyChannelDescriptorListener : public IPC::Channel::Listener { + public: + virtual void OnMessageReceived(const IPC::Message& message) { + void* iter = NULL; + + FileDescriptor descriptor; + + ASSERT_TRUE( + IPC::ParamTraits<FileDescriptor>::Read(&message, &iter, &descriptor)); + VerifyDescriptor(&descriptor); + MessageLoop::current()->Quit(); + } + + virtual void OnChannelError() { + MessageLoop::current()->Quit(); + } + +private: + static void VerifyDescriptor(FileDescriptor* descriptor) { + const int fd = open("/dev/null", O_RDONLY); + struct stat st1, st2; + fstat(fd, &st1); + close(fd); + fstat(descriptor->fd, &st2); + close(descriptor->fd); + ASSERT_EQ(st1.st_ino, st2.st_ino); + } +}; + +TEST_F(IPCChannelTest, DescriptorTest) { + // Setup IPC channel. + MyChannelDescriptorListener listener; + + IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER, + &listener); + chan.Connect(); + + base::ProcessHandle process_handle = SpawnChild(TEST_DESCRIPTOR_CLIENT, + &chan); + ASSERT_TRUE(process_handle); + + FileDescriptor descriptor; + const int fd = open("/dev/null", 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<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)); +} + +MULTIPROCESS_TEST_MAIN(RunTestDescriptorClient) { + MessageLoopForIO main_message_loop; + MyChannelDescriptorListener listener; + + // setup IPC channel + IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_CLIENT, + &listener); + chan.Connect(); + + // run message loop + MessageLoop::current()->Run(); + // return true; + return NULL; +} + +#endif // defined(OS_POSIX) diff --git a/chrome/common/ipc_tests.cc b/chrome/common/ipc_tests.cc index 01873e7..f3a92ca 100644 --- a/chrome/common/ipc_tests.cc +++ b/chrome/common/ipc_tests.cc @@ -8,7 +8,6 @@ #include <windows.h> #elif defined(OS_POSIX) #include <sys/types.h> -#include <sys/stat.h> #include <unistd.h> #endif @@ -42,6 +41,8 @@ const wchar_t kTestClientChannel[] = L"T1"; const wchar_t kReflectorChannel[] = L"T2"; const wchar_t kFuzzerChannel[] = L"F3"; +const size_t kLongMessageStringNumBytes = 50000; + #ifndef PERFORMANCE_TEST void IPCChannelTest::SetUp() { @@ -170,7 +171,7 @@ static void Send(IPC::Message::Sender* sender, const char* text) { message->WriteString(std::string(text)); // Make sure we can handle large messages. - char junk[50000]; + char junk[kLongMessageStringNumBytes]; memset(junk, 'a', sizeof(junk)-1); junk[sizeof(junk)-1] = 0; message->WriteString(std::string(junk)); @@ -186,6 +187,10 @@ class MyChannelListener : public IPC::Channel::Listener { iter.NextInt(); const std::string data = iter.NextString(); + const std::string big_string = iter.NextString(); + EXPECT_EQ(kLongMessageStringNumBytes - 1, big_string.length()); + + if (--messages_left_ == 0) { MessageLoop::current()->Quit(); } else { @@ -208,9 +213,9 @@ class MyChannelListener : public IPC::Channel::Listener { IPC::Message::Sender* sender_; int messages_left_; }; -static MyChannelListener channel_listener; TEST_F(IPCChannelTest, ChannelTest) { + MyChannelListener channel_listener; // Setup IPC channel. IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER, &channel_listener); @@ -234,89 +239,9 @@ TEST_F(IPCChannelTest, ChannelTest) { base::CloseProcessHandle(process_handle); } -#if defined(OS_POSIX) - -class MyChannelDescriptorListener : public IPC::Channel::Listener { - public: - virtual void OnMessageReceived(const IPC::Message& message) { - void* iter = NULL; - - FileDescriptor descriptor; - - ASSERT_TRUE( - IPC::ParamTraits<FileDescriptor>::Read(&message, &iter, &descriptor)); - VerifyDescriptor(&descriptor); - MessageLoop::current()->Quit(); - } - - virtual void OnChannelError() { - MessageLoop::current()->Quit(); - } - -private: - static void VerifyDescriptor(FileDescriptor* descriptor) { - const int fd = open("/dev/null", O_RDONLY); - struct stat st1, st2; - fstat(fd, &st1); - close(fd); - fstat(descriptor->fd, &st2); - close(descriptor->fd); - ASSERT_EQ(st1.st_ino, st2.st_ino); - } -}; - -TEST_F(IPCChannelTest, DescriptorTest) { - // Setup IPC channel. - MyChannelDescriptorListener listener; - - IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER, - &listener); - chan.Connect(); - - base::ProcessHandle process_handle = SpawnChild(TEST_DESCRIPTOR_CLIENT, - &chan); - ASSERT_TRUE(process_handle); - - FileDescriptor descriptor; - const int fd = open("/dev/null", 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<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)); -} - -MULTIPROCESS_TEST_MAIN(RunTestDescriptorClient) { - MessageLoopForIO main_message_loop; - MyChannelDescriptorListener listener; - - // setup IPC channel - IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_CLIENT, - &listener); - chan.Connect(); - - // run message loop - MessageLoop::current()->Run(); - // return true; - return NULL; -} - -#endif // defined(OS_POSIX) - TEST_F(IPCChannelTest, ChannelProxyTest) { + MyChannelListener channel_listener; + // The thread needs to out-live the ChannelProxy. base::Thread thread("ChannelProxyTestServer"); base::Thread::Options options; @@ -365,6 +290,7 @@ TEST_F(IPCChannelTest, ChannelProxyTest) { MULTIPROCESS_TEST_MAIN(RunTestClient) { MessageLoopForIO main_message_loop; + MyChannelListener channel_listener; // setup IPC channel IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_CLIENT, diff --git a/chrome/common/ipc_tests.scons b/chrome/common/ipc_tests.scons index d113055..a9dd518 100644 --- a/chrome/common/ipc_tests.scons +++ b/chrome/common/ipc_tests.scons @@ -76,6 +76,7 @@ if env.Bit('windows'): input_files = ChromeFileList([ 'ipc_fuzzing_tests.cc', + 'ipc_send_fds_test.cc', 'ipc_tests.cc', 'ipc_tests.h', '$BASE_DIR/perftimer$OBJSUFFIX', |