| 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> |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 virtual void OnChannelListenError() OVERRIDE { | 75 virtual void OnChannelListenError() OVERRIDE { |
| 76 status_ = LISTEN_ERROR; | 76 status_ = LISTEN_ERROR; |
| 77 if (!quit_only_on_message_) { | 77 if (!quit_only_on_message_) { |
| 78 QuitRunLoop(); | 78 QuitRunLoop(); |
| 79 } | 79 } |
| 80 } | 80 } |
| 81 | 81 |
| 82 STATUS status() { return status_; } | 82 STATUS status() { return status_; } |
| 83 | 83 |
| 84 void QuitRunLoop() { | 84 void QuitRunLoop() { |
| 85 MessageLoopForIO::current()->QuitNow(); | 85 base::MessageLoopForIO::current()->QuitNow(); |
| 86 } | 86 } |
| 87 | 87 |
| 88 private: | 88 private: |
| 89 // The current status of the listener. | 89 // The current status of the listener. |
| 90 STATUS status_; | 90 STATUS status_; |
| 91 // If |quit_only_on_message_| then the listener will only break out of | 91 // If |quit_only_on_message_| then the listener will only break out of |
| 92 // the run loop when kQuitMessage is received. | 92 // the run loop when kQuitMessage is received. |
| 93 bool quit_only_on_message_; | 93 bool quit_only_on_message_; |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 class IPCChannelPosixTest : public base::MultiProcessTest { | 96 class IPCChannelPosixTest : public base::MultiProcessTest { |
| 97 public: | 97 public: |
| 98 static void SetUpSocket(IPC::ChannelHandle *handle, | 98 static void SetUpSocket(IPC::ChannelHandle *handle, |
| 99 IPC::Channel::Mode mode); | 99 IPC::Channel::Mode mode); |
| 100 static void SpinRunLoop(base::TimeDelta delay); | 100 static void SpinRunLoop(base::TimeDelta delay); |
| 101 static const std::string GetConnectionSocketName(); | 101 static const std::string GetConnectionSocketName(); |
| 102 static const std::string GetChannelDirName(); | 102 static const std::string GetChannelDirName(); |
| 103 | 103 |
| 104 protected: | 104 protected: |
| 105 virtual void SetUp(); | 105 virtual void SetUp(); |
| 106 virtual void TearDown(); | 106 virtual void TearDown(); |
| 107 | 107 |
| 108 private: | 108 private: |
| 109 scoped_ptr<MessageLoopForIO> message_loop_; | 109 scoped_ptr<base::MessageLoopForIO> message_loop_; |
| 110 }; | 110 }; |
| 111 | 111 |
| 112 const std::string IPCChannelPosixTest::GetChannelDirName() { | 112 const std::string IPCChannelPosixTest::GetChannelDirName() { |
| 113 #if defined(OS_ANDROID) | 113 #if defined(OS_ANDROID) |
| 114 base::FilePath tmp_dir; | 114 base::FilePath tmp_dir; |
| 115 PathService::Get(base::DIR_CACHE, &tmp_dir); | 115 PathService::Get(base::DIR_CACHE, &tmp_dir); |
| 116 return tmp_dir.value(); | 116 return tmp_dir.value(); |
| 117 #else | 117 #else |
| 118 return "/var/tmp"; | 118 return "/var/tmp"; |
| 119 #endif | 119 #endif |
| 120 } | 120 } |
| 121 | 121 |
| 122 const std::string IPCChannelPosixTest::GetConnectionSocketName() { | 122 const std::string IPCChannelPosixTest::GetConnectionSocketName() { |
| 123 return GetChannelDirName() + "/chrome_IPCChannelPosixTest__ConnectionSocket"; | 123 return GetChannelDirName() + "/chrome_IPCChannelPosixTest__ConnectionSocket"; |
| 124 } | 124 } |
| 125 | 125 |
| 126 void IPCChannelPosixTest::SetUp() { | 126 void IPCChannelPosixTest::SetUp() { |
| 127 MultiProcessTest::SetUp(); | 127 MultiProcessTest::SetUp(); |
| 128 // Construct a fresh IO Message loop for the duration of each test. | 128 // Construct a fresh IO Message loop for the duration of each test. |
| 129 message_loop_.reset(new MessageLoopForIO()); | 129 message_loop_.reset(new base::MessageLoopForIO()); |
| 130 } | 130 } |
| 131 | 131 |
| 132 void IPCChannelPosixTest::TearDown() { | 132 void IPCChannelPosixTest::TearDown() { |
| 133 message_loop_.reset(NULL); | 133 message_loop_.reset(NULL); |
| 134 MultiProcessTest::TearDown(); | 134 MultiProcessTest::TearDown(); |
| 135 } | 135 } |
| 136 | 136 |
| 137 // Create up a socket and bind and listen to it, or connect it | 137 // Create up a socket and bind and listen to it, or connect it |
| 138 // depending on the |mode|. | 138 // depending on the |mode|. |
| 139 void IPCChannelPosixTest::SetUpSocket(IPC::ChannelHandle *handle, | 139 void IPCChannelPosixTest::SetUpSocket(IPC::ChannelHandle *handle, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 server_address_len), 0) << server_address.sun_path | 173 server_address_len), 0) << server_address.sun_path |
| 174 << ": " << strerror(errno) | 174 << ": " << strerror(errno) |
| 175 << "(" << errno << ")"; | 175 << "(" << errno << ")"; |
| 176 } else { | 176 } else { |
| 177 FAIL() << "Unknown mode " << mode; | 177 FAIL() << "Unknown mode " << mode; |
| 178 } | 178 } |
| 179 handle->socket.fd = socket_fd; | 179 handle->socket.fd = socket_fd; |
| 180 } | 180 } |
| 181 | 181 |
| 182 void IPCChannelPosixTest::SpinRunLoop(base::TimeDelta delay) { | 182 void IPCChannelPosixTest::SpinRunLoop(base::TimeDelta delay) { |
| 183 MessageLoopForIO *loop = MessageLoopForIO::current(); | 183 base::MessageLoopForIO* loop = base::MessageLoopForIO::current(); |
| 184 // Post a quit task so that this loop eventually ends and we don't hang | 184 // Post a quit task so that this loop eventually ends and we don't hang |
| 185 // in the case of a bad test. Usually, the run loop will quit sooner than | 185 // in the case of a bad test. Usually, the run loop will quit sooner than |
| 186 // that because all tests use a IPCChannelPosixTestListener which quits the | 186 // that because all tests use a IPCChannelPosixTestListener which quits the |
| 187 // current run loop on any channel activity. | 187 // current run loop on any channel activity. |
| 188 loop->PostDelayedTask( | 188 loop->PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(), delay); |
| 189 FROM_HERE, | |
| 190 MessageLoop::QuitClosure(), | |
| 191 delay); | |
| 192 loop->Run(); | 189 loop->Run(); |
| 193 } | 190 } |
| 194 | 191 |
| 195 TEST_F(IPCChannelPosixTest, BasicListen) { | 192 TEST_F(IPCChannelPosixTest, BasicListen) { |
| 196 const std::string kChannelName = | 193 const std::string kChannelName = |
| 197 GetChannelDirName() + "/IPCChannelPosixTest_BasicListen"; | 194 GetChannelDirName() + "/IPCChannelPosixTest_BasicListen"; |
| 198 | 195 |
| 199 // Test creating a socket that is listening. | 196 // Test creating a socket that is listening. |
| 200 IPC::ChannelHandle handle(kChannelName); | 197 IPC::ChannelHandle handle(kChannelName); |
| 201 SetUpSocket(&handle, IPC::Channel::MODE_NAMED_SERVER); | 198 SetUpSocket(&handle, IPC::Channel::MODE_NAMED_SERVER); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 IPC::Channel channel(chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener); | 381 IPC::Channel channel(chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener); |
| 385 ASSERT_TRUE(IPC::Channel::IsNamedServerInitialized( | 382 ASSERT_TRUE(IPC::Channel::IsNamedServerInitialized( |
| 386 connection_socket_name)); | 383 connection_socket_name)); |
| 387 channel.Close(); | 384 channel.Close(); |
| 388 ASSERT_FALSE(IPC::Channel::IsNamedServerInitialized( | 385 ASSERT_FALSE(IPC::Channel::IsNamedServerInitialized( |
| 389 connection_socket_name)); | 386 connection_socket_name)); |
| 390 } | 387 } |
| 391 | 388 |
| 392 // A long running process that connects to us | 389 // A long running process that connects to us |
| 393 MULTIPROCESS_TEST_MAIN(IPCChannelPosixTestConnectionProc) { | 390 MULTIPROCESS_TEST_MAIN(IPCChannelPosixTestConnectionProc) { |
| 394 MessageLoopForIO message_loop; | 391 base::MessageLoopForIO message_loop; |
| 395 IPCChannelPosixTestListener listener(true); | 392 IPCChannelPosixTestListener listener(true); |
| 396 IPC::ChannelHandle handle(IPCChannelPosixTest::GetConnectionSocketName()); | 393 IPC::ChannelHandle handle(IPCChannelPosixTest::GetConnectionSocketName()); |
| 397 IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT); | 394 IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT); |
| 398 IPC::Channel channel(handle, IPC::Channel::MODE_NAMED_CLIENT, &listener); | 395 IPC::Channel channel(handle, IPC::Channel::MODE_NAMED_CLIENT, &listener); |
| 399 EXPECT_TRUE(channel.Connect()); | 396 EXPECT_TRUE(channel.Connect()); |
| 400 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); | 397 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 401 EXPECT_EQ(IPCChannelPosixTestListener::MESSAGE_RECEIVED, listener.status()); | 398 EXPECT_EQ(IPCChannelPosixTestListener::MESSAGE_RECEIVED, listener.status()); |
| 402 return 0; | 399 return 0; |
| 403 } | 400 } |
| 404 | 401 |
| 405 // Simple external process that shouldn't be able to connect to us. | 402 // Simple external process that shouldn't be able to connect to us. |
| 406 MULTIPROCESS_TEST_MAIN(IPCChannelPosixFailConnectionProc) { | 403 MULTIPROCESS_TEST_MAIN(IPCChannelPosixFailConnectionProc) { |
| 407 MessageLoopForIO message_loop; | 404 base::MessageLoopForIO message_loop; |
| 408 IPCChannelPosixTestListener listener(false); | 405 IPCChannelPosixTestListener listener(false); |
| 409 IPC::ChannelHandle handle(IPCChannelPosixTest::GetConnectionSocketName()); | 406 IPC::ChannelHandle handle(IPCChannelPosixTest::GetConnectionSocketName()); |
| 410 IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT); | 407 IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT); |
| 411 IPC::Channel channel(handle, IPC::Channel::MODE_NAMED_CLIENT, &listener); | 408 IPC::Channel channel(handle, IPC::Channel::MODE_NAMED_CLIENT, &listener); |
| 412 | 409 |
| 413 // In this case connect may succeed or fail depending on if the packet | 410 // In this case connect may succeed or fail depending on if the packet |
| 414 // actually gets sent at sendmsg. Since we never delay on send, we may not | 411 // actually gets sent at sendmsg. Since we never delay on send, we may not |
| 415 // see the error. However even if connect succeeds, eventually we will get an | 412 // see the error. However even if connect succeeds, eventually we will get an |
| 416 // error back since the channel will be closed when we attempt to read from | 413 // error back since the channel will be closed when we attempt to read from |
| 417 // it. | 414 // it. |
| 418 bool connected = channel.Connect(); | 415 bool connected = channel.Connect(); |
| 419 if (connected) { | 416 if (connected) { |
| 420 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); | 417 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 421 EXPECT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status()); | 418 EXPECT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status()); |
| 422 } else { | 419 } else { |
| 423 EXPECT_EQ(IPCChannelPosixTestListener::DISCONNECTED, listener.status()); | 420 EXPECT_EQ(IPCChannelPosixTestListener::DISCONNECTED, listener.status()); |
| 424 } | 421 } |
| 425 return 0; | 422 return 0; |
| 426 } | 423 } |
| 427 | 424 |
| 428 } // namespace | 425 } // namespace |
| OLD | NEW |