summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/chrome.xcodeproj/project.pbxproj4
-rw-r--r--chrome/common/ipc_send_fds_test.cc95
-rw-r--r--chrome/common/ipc_tests.cc96
-rw-r--r--chrome/common/ipc_tests.scons1
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',