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 // These tests are POSIX only. | 5 // These tests are POSIX only. |
6 | 6 |
7 #include "ipc/ipc_channel_posix.h" | 7 #include "ipc/ipc_channel_posix.h" |
8 | 8 |
9 #include <fcntl.h> | 9 #include <fcntl.h> |
10 #include <sys/socket.h> | 10 #include <sys/socket.h> |
11 #include <sys/un.h> | 11 #include <sys/un.h> |
12 #include <unistd.h> | 12 #include <unistd.h> |
13 | 13 |
14 #include "base/basictypes.h" | 14 #include "base/basictypes.h" |
15 #include "base/file_util.h" | 15 #include "base/file_util.h" |
16 #include "base/files/file_path.h" | 16 #include "base/files/file_path.h" |
17 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
18 #include "base/message_loop.h" | 18 #include "base/message_loop.h" |
19 #include "base/path_service.h" | 19 #include "base/path_service.h" |
20 #include "base/posix/eintr_wrapper.h" | 20 #include "base/posix/eintr_wrapper.h" |
21 #include "base/test/multiprocess_test.h" | 21 #include "base/test/multiprocess_test.h" |
22 #include "base/test/test_timeouts.h" | 22 #include "base/test/test_timeouts.h" |
23 #include "ipc/ipc_listener.h" | 23 #include "ipc/ipc_listener.h" |
| 24 #include "ipc/unix_domain_socket_util.h" |
24 #include "testing/multiprocess_func_list.h" | 25 #include "testing/multiprocess_func_list.h" |
25 | 26 |
26 namespace { | 27 namespace { |
27 | 28 |
28 static const uint32 kQuitMessage = 47; | 29 static const uint32 kQuitMessage = 47; |
29 | 30 |
30 class IPCChannelPosixTestListener : public IPC::Listener { | 31 class IPCChannelPosixTestListener : public IPC::Listener { |
31 public: | 32 public: |
32 enum STATUS { | 33 enum STATUS { |
33 DISCONNECTED, | 34 DISCONNECTED, |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 void IPCChannelPosixTest::SetUpSocket(IPC::ChannelHandle *handle, | 139 void IPCChannelPosixTest::SetUpSocket(IPC::ChannelHandle *handle, |
139 IPC::Channel::Mode mode) { | 140 IPC::Channel::Mode mode) { |
140 const std::string& name = handle->name; | 141 const std::string& name = handle->name; |
141 | 142 |
142 int socket_fd = socket(PF_UNIX, SOCK_STREAM, 0); | 143 int socket_fd = socket(PF_UNIX, SOCK_STREAM, 0); |
143 ASSERT_GE(socket_fd, 0) << name; | 144 ASSERT_GE(socket_fd, 0) << name; |
144 ASSERT_GE(fcntl(socket_fd, F_SETFL, O_NONBLOCK), 0); | 145 ASSERT_GE(fcntl(socket_fd, F_SETFL, O_NONBLOCK), 0); |
145 struct sockaddr_un server_address = { 0 }; | 146 struct sockaddr_un server_address = { 0 }; |
146 memset(&server_address, 0, sizeof(server_address)); | 147 memset(&server_address, 0, sizeof(server_address)); |
147 server_address.sun_family = AF_UNIX; | 148 server_address.sun_family = AF_UNIX; |
148 int path_len = snprintf(server_address.sun_path, IPC::kMaxPipeNameLength, | 149 int path_len = snprintf(server_address.sun_path, IPC::kMaxSocketNameLength, |
149 "%s", name.c_str()); | 150 "%s", name.c_str()); |
150 DCHECK_EQ(static_cast<int>(name.length()), path_len); | 151 DCHECK_EQ(static_cast<int>(name.length()), path_len); |
151 size_t server_address_len = offsetof(struct sockaddr_un, | 152 size_t server_address_len = offsetof(struct sockaddr_un, |
152 sun_path) + path_len + 1; | 153 sun_path) + path_len + 1; |
153 | 154 |
154 if (mode == IPC::Channel::MODE_NAMED_SERVER) { | 155 if (mode == IPC::Channel::MODE_NAMED_SERVER) { |
155 // Only one server at a time. Cleanup garbage if it exists. | 156 // Only one server at a time. Cleanup garbage if it exists. |
156 unlink(name.c_str()); | 157 unlink(name.c_str()); |
157 // Make sure the path we need exists. | 158 // Make sure the path we need exists. |
158 base::FilePath path(name); | 159 base::FilePath path(name); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 ASSERT_FALSE(channel.Connect()); | 305 ASSERT_FALSE(channel.Connect()); |
305 | 306 |
306 // Test name that is too long. | 307 // Test name that is too long. |
307 const char *kTooLongName = "This_is_a_very_long_name_to_proactively_implement" | 308 const char *kTooLongName = "This_is_a_very_long_name_to_proactively_implement" |
308 "client-centered_synergy_through_top-line" | 309 "client-centered_synergy_through_top-line" |
309 "platforms_Phosfluorescently_disintermediate_" | 310 "platforms_Phosfluorescently_disintermediate_" |
310 "clicks-and-mortar_best_practices_without_" | 311 "clicks-and-mortar_best_practices_without_" |
311 "future-proof_growth_strategies_Continually" | 312 "future-proof_growth_strategies_Continually" |
312 "pontificate_proactive_potentialities_before" | 313 "pontificate_proactive_potentialities_before" |
313 "leading-edge_processes"; | 314 "leading-edge_processes"; |
314 EXPECT_GE(strlen(kTooLongName), IPC::kMaxPipeNameLength); | 315 EXPECT_GE(strlen(kTooLongName), IPC::kMaxSocketNameLength); |
315 IPC::ChannelHandle handle2(kTooLongName); | 316 IPC::ChannelHandle handle2(kTooLongName); |
316 IPC::Channel channel2(handle2, IPC::Channel::MODE_NAMED_SERVER, NULL); | 317 IPC::Channel channel2(handle2, IPC::Channel::MODE_NAMED_SERVER, NULL); |
317 EXPECT_FALSE(channel2.Connect()); | 318 EXPECT_FALSE(channel2.Connect()); |
318 } | 319 } |
319 | 320 |
320 TEST_F(IPCChannelPosixTest, MultiConnection) { | 321 TEST_F(IPCChannelPosixTest, MultiConnection) { |
321 // Test setting up a connection to an external process, and then have | 322 // Test setting up a connection to an external process, and then have |
322 // another external process attempt to connect to us. | 323 // another external process attempt to connect to us. |
323 IPCChannelPosixTestListener listener(false); | 324 IPCChannelPosixTestListener listener(false); |
324 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); | 325 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 if (connected) { | 419 if (connected) { |
419 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); | 420 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); |
420 EXPECT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status()); | 421 EXPECT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status()); |
421 } else { | 422 } else { |
422 EXPECT_EQ(IPCChannelPosixTestListener::DISCONNECTED, listener.status()); | 423 EXPECT_EQ(IPCChannelPosixTestListener::DISCONNECTED, listener.status()); |
423 } | 424 } |
424 return 0; | 425 return 0; |
425 } | 426 } |
426 | 427 |
427 } // namespace | 428 } // namespace |
OLD | NEW |