| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #include "ipc/ipc_tests.h" | |
| 8 | |
| 9 #if defined(OS_MACOSX) | 7 #if defined(OS_MACOSX) |
| 10 extern "C" { | 8 extern "C" { |
| 11 #include <sandbox.h> | 9 #include <sandbox.h> |
| 12 } | 10 } |
| 13 #endif | 11 #endif |
| 14 #include <fcntl.h> | 12 #include <fcntl.h> |
| 15 #include <sys/stat.h> | 13 #include <sys/stat.h> |
| 16 | 14 |
| 17 #include "base/message_loop.h" | 15 #include "base/message_loop.h" |
| 18 #include "base/posix/eintr_wrapper.h" | 16 #include "base/posix/eintr_wrapper.h" |
| 19 #include "ipc/ipc_channel.h" | 17 #include "ipc/ipc_channel.h" |
| 20 #include "ipc/ipc_listener.h" | 18 #include "ipc/ipc_listener.h" |
| 21 #include "ipc/ipc_message_utils.h" | 19 #include "ipc/ipc_message_utils.h" |
| 22 #include "ipc/ipc_multiprocess_test.h" | 20 #include "ipc/ipc_multiprocess_test.h" |
| 21 #include "ipc/ipc_test_base.h" |
| 23 #include "testing/multiprocess_func_list.h" | 22 #include "testing/multiprocess_func_list.h" |
| 24 | 23 |
| 25 #if defined(OS_POSIX) | 24 #if defined(OS_POSIX) |
| 26 #include "base/file_descriptor_posix.h" | 25 #include "base/file_descriptor_posix.h" |
| 27 | 26 |
| 28 namespace { | 27 namespace { |
| 29 | 28 |
| 30 const unsigned kNumFDsToSend = 20; | 29 const unsigned kNumFDsToSend = 20; |
| 31 const char* kDevZeroPath = "/dev/zero"; | 30 const char* kDevZeroPath = "/dev/zero"; |
| 32 | 31 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 | 124 |
| 126 // Verify that the message loop was exited due to getting the correct | 125 // Verify that the message loop was exited due to getting the correct |
| 127 // number of descriptors, and not because the channel closing unexpectedly. | 126 // number of descriptors, and not because the channel closing unexpectedly. |
| 128 CHECK(listener.GotExpectedNumberOfDescriptors()); | 127 CHECK(listener.GotExpectedNumberOfDescriptors()); |
| 129 | 128 |
| 130 return 0; | 129 return 0; |
| 131 } | 130 } |
| 132 | 131 |
| 133 } // namespace | 132 } // namespace |
| 134 | 133 |
| 135 // --------------------------------------------------------------------------- | 134 class IPCSendFdsTest : public IPCTestBase { |
| 135 }; |
| 136 |
| 136 #if defined(OS_MACOSX) | 137 #if defined(OS_MACOSX) |
| 137 // TODO(port): Make this test cross-platform. | 138 // TODO(port): Make this test cross-platform. |
| 138 MULTIPROCESS_IPC_TEST_MAIN(RunTestDescriptorClientSandboxed) { | 139 MULTIPROCESS_IPC_TEST_MAIN(RunTestDescriptorClientSandboxed) { |
| 139 struct stat st; | 140 struct stat st; |
| 140 const int fd = open(kDevZeroPath, O_RDONLY); | 141 const int fd = open(kDevZeroPath, O_RDONLY); |
| 141 fstat(fd, &st); | 142 fstat(fd, &st); |
| 142 if (HANDLE_EINTR(close(fd)) < 0) { | 143 if (HANDLE_EINTR(close(fd)) < 0) { |
| 143 return -1; | 144 return -1; |
| 144 } | 145 } |
| 145 | 146 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 158 if (open(kDevZeroPath, O_RDONLY) != -1) { | 159 if (open(kDevZeroPath, O_RDONLY) != -1) { |
| 159 LOG(ERROR) << "Sandbox wasn't properly enabled"; | 160 LOG(ERROR) << "Sandbox wasn't properly enabled"; |
| 160 return -1; | 161 return -1; |
| 161 } | 162 } |
| 162 | 163 |
| 163 // See if we can receive a file descriptor. | 164 // See if we can receive a file descriptor. |
| 164 return TestDescriptorClient(st.st_ino); | 165 return TestDescriptorClient(st.st_ino); |
| 165 } | 166 } |
| 166 | 167 |
| 167 // Test that FDs are correctly sent to a sandboxed process. | 168 // Test that FDs are correctly sent to a sandboxed process. |
| 168 TEST_F(IPCChannelTest, DescriptorTestSandboxed) { | 169 TEST_F(IPCSendFdsTest, DescriptorTestSandboxed) { |
| 169 // Setup IPC channel. | 170 // Setup IPC channel. |
| 170 MyChannelDescriptorListener listener(-1); | 171 MyChannelDescriptorListener listener(-1); |
| 171 | 172 |
| 172 IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER, | 173 IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER, |
| 173 &listener); | 174 &listener); |
| 174 ASSERT_TRUE(chan.Connect()); | 175 ASSERT_TRUE(chan.Connect()); |
| 175 | 176 |
| 176 base::ProcessHandle process_handle = SpawnChild( | 177 base::ProcessHandle process_handle = SpawnChild( |
| 177 TEST_DESCRIPTOR_CLIENT_SANDBOXED, | 178 TEST_DESCRIPTOR_CLIENT_SANDBOXED, |
| 178 &chan); | 179 &chan); |
| 179 TestDescriptorServer(chan, process_handle); | 180 TestDescriptorServer(chan, process_handle); |
| 180 } | 181 } |
| 181 #endif // defined(OS_MACOSX) | 182 #endif // defined(OS_MACOSX) |
| 182 | 183 |
| 183 MULTIPROCESS_IPC_TEST_MAIN(RunTestDescriptorClient) { | 184 MULTIPROCESS_IPC_TEST_MAIN(RunTestDescriptorClient) { |
| 184 struct stat st; | 185 struct stat st; |
| 185 const int fd = open(kDevZeroPath, O_RDONLY); | 186 const int fd = open(kDevZeroPath, O_RDONLY); |
| 186 fstat(fd, &st); | 187 fstat(fd, &st); |
| 187 EXPECT_GE(HANDLE_EINTR(close(fd)), 0); | 188 EXPECT_GE(HANDLE_EINTR(close(fd)), 0); |
| 188 | 189 |
| 189 return TestDescriptorClient(st.st_ino); | 190 return TestDescriptorClient(st.st_ino); |
| 190 } | 191 } |
| 191 | 192 |
| 192 TEST_F(IPCChannelTest, DescriptorTest) { | 193 TEST_F(IPCSendFdsTest, DescriptorTest) { |
| 193 // Setup IPC channel. | 194 // Setup IPC channel. |
| 194 MyChannelDescriptorListener listener(-1); | 195 MyChannelDescriptorListener listener(-1); |
| 195 | 196 |
| 196 IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER, | 197 IPC::Channel chan(kTestClientChannel, IPC::Channel::MODE_SERVER, |
| 197 &listener); | 198 &listener); |
| 198 ASSERT_TRUE(chan.Connect()); | 199 ASSERT_TRUE(chan.Connect()); |
| 199 | 200 |
| 200 base::ProcessHandle process_handle = SpawnChild(TEST_DESCRIPTOR_CLIENT, | 201 base::ProcessHandle process_handle = SpawnChild(TEST_DESCRIPTOR_CLIENT, |
| 201 &chan); | 202 &chan); |
| 202 TestDescriptorServer(chan, process_handle); | 203 TestDescriptorServer(chan, process_handle); |
| 203 } | 204 } |
| 204 | 205 |
| 205 #endif // defined(OS_POSIX) | 206 #endif // defined(OS_POSIX) |
| OLD | NEW |