viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "build/build_config.h" |
| 6 | |
| 7 | #if defined(OS_WIN) |
| 8 | #include <windows.h> |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 9 | #endif |
| 10 | |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 11 | #include <string> |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 12 | |
avi@chromium.org | a29af56 | 2013-07-18 08:00:30 +0900 | [diff] [blame] | 13 | #include "base/message_loop/message_loop.h" |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 14 | #include "base/pickle.h" |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 15 | #include "base/threading/thread.h" |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 16 | #include "ipc/ipc_message.h" |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 17 | #include "ipc/ipc_test_base.h" |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 18 | #include "ipc/ipc_test_channel_listener.h" |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 19 | |
viettrungluu@chromium.org | 7ca1913 | 2013-01-12 05:56:22 +0900 | [diff] [blame] | 20 | namespace { |
| 21 | |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 22 | class IPCChannelTest : public IPCTestBase { |
| 23 | }; |
| 24 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 25 | // TODO(viettrungluu): Move to a separate IPCMessageTest. |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 26 | TEST_F(IPCChannelTest, BasicMessageTest) { |
| 27 | int v1 = 10; |
| 28 | std::string v2("foobar"); |
| 29 | std::wstring v3(L"hello world"); |
| 30 | |
bbudge@chromium.org | ab4c6bc | 2013-11-05 07:28:12 +0900 | [diff] [blame] | 31 | IPC::Message m(0, 1, IPC::Message::PRIORITY_NORMAL); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 32 | EXPECT_TRUE(m.WriteInt(v1)); |
| 33 | EXPECT_TRUE(m.WriteString(v2)); |
| 34 | EXPECT_TRUE(m.WriteWString(v3)); |
| 35 | |
| 36 | PickleIterator iter(m); |
| 37 | |
| 38 | int vi; |
| 39 | std::string vs; |
| 40 | std::wstring vw; |
| 41 | |
| 42 | EXPECT_TRUE(m.ReadInt(&iter, &vi)); |
| 43 | EXPECT_EQ(v1, vi); |
| 44 | |
| 45 | EXPECT_TRUE(m.ReadString(&iter, &vs)); |
| 46 | EXPECT_EQ(v2, vs); |
| 47 | |
| 48 | EXPECT_TRUE(m.ReadWString(&iter, &vw)); |
| 49 | EXPECT_EQ(v3, vw); |
| 50 | |
| 51 | // should fail |
| 52 | EXPECT_FALSE(m.ReadInt(&iter, &vi)); |
| 53 | EXPECT_FALSE(m.ReadString(&iter, &vs)); |
| 54 | EXPECT_FALSE(m.ReadWString(&iter, &vw)); |
| 55 | } |
| 56 | |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 57 | TEST_F(IPCChannelTest, ChannelTest) { |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 58 | Init("GenericClient"); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 59 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 60 | // Set up IPC channel and start client. |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 61 | IPC::TestChannelListener listener; |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 62 | CreateChannel(&listener); |
| 63 | listener.Init(sender()); |
| 64 | ASSERT_TRUE(ConnectChannel()); |
| 65 | ASSERT_TRUE(StartClient()); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 66 | |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 67 | IPC::TestChannelListener::SendOneMessage(sender(), "hello from parent"); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 68 | |
| 69 | // Run message loop. |
xhwang@chromium.org | 0b2c2a5 | 2013-05-01 05:55:03 +0900 | [diff] [blame] | 70 | base::MessageLoop::current()->Run(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 71 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 72 | // Close the channel so the client's OnChannelError() gets fired. |
| 73 | channel()->Close(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 74 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 75 | EXPECT_TRUE(WaitForClientShutdown()); |
| 76 | DestroyChannel(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 77 | } |
| 78 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 79 | // TODO(viettrungluu): Move to a separate IPCChannelWinTest. |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 80 | #if defined(OS_WIN) |
| 81 | TEST_F(IPCChannelTest, ChannelTestExistingPipe) { |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 82 | Init("GenericClient"); |
| 83 | |
| 84 | // Create pipe manually using the standard Chromium name and set up IPC |
| 85 | // channel. |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 86 | IPC::TestChannelListener listener; |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 87 | std::string name("\\\\.\\pipe\\chrome."); |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 88 | name.append(GetChannelName("GenericClient")); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 89 | HANDLE pipe = CreateNamedPipeA(name.c_str(), |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 90 | PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | |
| 91 | FILE_FLAG_FIRST_PIPE_INSTANCE, |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 92 | PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, |
| 93 | 1, |
| 94 | 4096, |
| 95 | 4096, |
| 96 | 5000, |
| 97 | NULL); |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 98 | CreateChannelFromChannelHandle(IPC::ChannelHandle(pipe), &listener); |
| 99 | CloseHandle(pipe); // The channel duplicates the handle. |
| 100 | listener.Init(sender()); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 101 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 102 | // Connect to channel and start client. |
| 103 | ASSERT_TRUE(ConnectChannel()); |
| 104 | ASSERT_TRUE(StartClient()); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 105 | |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 106 | IPC::TestChannelListener::SendOneMessage(sender(), "hello from parent"); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 107 | |
| 108 | // Run message loop. |
xhwang@chromium.org | 0b2c2a5 | 2013-05-01 05:55:03 +0900 | [diff] [blame] | 109 | base::MessageLoop::current()->Run(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 110 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 111 | // Close the channel so the client's OnChannelError() gets fired. |
| 112 | channel()->Close(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 113 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 114 | EXPECT_TRUE(WaitForClientShutdown()); |
| 115 | DestroyChannel(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 116 | } |
| 117 | #endif // defined (OS_WIN) |
| 118 | |
| 119 | TEST_F(IPCChannelTest, ChannelProxyTest) { |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 120 | Init("GenericClient"); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 121 | |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 122 | base::Thread thread("ChannelProxyTestServer"); |
| 123 | base::Thread::Options options; |
xhwang@chromium.org | 0b2c2a5 | 2013-05-01 05:55:03 +0900 | [diff] [blame] | 124 | options.message_loop_type = base::MessageLoop::TYPE_IO; |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 125 | thread.StartWithOptions(options); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 126 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 127 | // Set up IPC channel proxy. |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 128 | IPC::TestChannelListener listener; |
rsleevi@chromium.org | 64293f1 | 2013-06-12 01:46:36 +0900 | [diff] [blame] | 129 | CreateChannelProxy(&listener, thread.message_loop_proxy().get()); |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 130 | listener.Init(sender()); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 131 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 132 | ASSERT_TRUE(StartClient()); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 133 | |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 134 | IPC::TestChannelListener::SendOneMessage(sender(), "hello from parent"); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 135 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 136 | // Run message loop. |
xhwang@chromium.org | 0b2c2a5 | 2013-05-01 05:55:03 +0900 | [diff] [blame] | 137 | base::MessageLoop::current()->Run(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 138 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 139 | EXPECT_TRUE(WaitForClientShutdown()); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 140 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 141 | // Destroy the channel proxy before shutting down the thread. |
| 142 | DestroyChannelProxy(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 143 | thread.Stop(); |
| 144 | } |
| 145 | |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 146 | class ChannelListenerWithOnConnectedSend : public IPC::TestChannelListener { |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 147 | public: |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 148 | ChannelListenerWithOnConnectedSend() {} |
| 149 | virtual ~ChannelListenerWithOnConnectedSend() {} |
| 150 | |
mostynb | d41cdbb | 2014-10-07 16:17:16 +0900 | [diff] [blame^] | 151 | virtual void OnChannelConnected(int32 peer_pid) override { |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 152 | SendNextMessage(); |
| 153 | } |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 154 | }; |
| 155 | |
| 156 | #if defined(OS_WIN) |
| 157 | // Acting flakey in Windows. http://crbug.com/129595 |
| 158 | #define MAYBE_SendMessageInChannelConnected DISABLED_SendMessageInChannelConnected |
| 159 | #else |
| 160 | #define MAYBE_SendMessageInChannelConnected SendMessageInChannelConnected |
| 161 | #endif |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 162 | // This tests the case of a listener sending back an event in its |
| 163 | // OnChannelConnected handler. |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 164 | TEST_F(IPCChannelTest, MAYBE_SendMessageInChannelConnected) { |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 165 | Init("GenericClient"); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 166 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 167 | // Set up IPC channel and start client. |
| 168 | ChannelListenerWithOnConnectedSend listener; |
| 169 | CreateChannel(&listener); |
| 170 | listener.Init(sender()); |
| 171 | ASSERT_TRUE(ConnectChannel()); |
| 172 | ASSERT_TRUE(StartClient()); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 173 | |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 174 | IPC::TestChannelListener::SendOneMessage(sender(), "hello from parent"); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 175 | |
| 176 | // Run message loop. |
xhwang@chromium.org | 0b2c2a5 | 2013-05-01 05:55:03 +0900 | [diff] [blame] | 177 | base::MessageLoop::current()->Run(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 178 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 179 | // Close the channel so the client's OnChannelError() gets fired. |
| 180 | channel()->Close(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 181 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 182 | EXPECT_TRUE(WaitForClientShutdown()); |
| 183 | DestroyChannel(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 184 | } |
| 185 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 186 | MULTIPROCESS_IPC_TEST_CLIENT_MAIN(GenericClient) { |
xhwang@chromium.org | 0b2c2a5 | 2013-05-01 05:55:03 +0900 | [diff] [blame] | 187 | base::MessageLoopForIO main_message_loop; |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 188 | IPC::TestChannelListener listener; |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 189 | |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 190 | // Set up IPC channel. |
morrita@chromium.org | 2ced004 | 2014-05-30 12:58:59 +0900 | [diff] [blame] | 191 | scoped_ptr<IPC::Channel> channel(IPC::Channel::CreateClient( |
| 192 | IPCTestBase::GetChannelName("GenericClient"), |
| 193 | &listener)); |
| 194 | CHECK(channel->Connect()); |
| 195 | listener.Init(channel.get()); |
morrita@chromium.org | 15996aa | 2014-08-05 08:44:17 +0900 | [diff] [blame] | 196 | IPC::TestChannelListener::SendOneMessage(channel.get(), "hello from child"); |
viettrungluu@chromium.org | 0015594 | 2013-01-26 06:51:35 +0900 | [diff] [blame] | 197 | |
xhwang@chromium.org | 0b2c2a5 | 2013-05-01 05:55:03 +0900 | [diff] [blame] | 198 | base::MessageLoop::current()->Run(); |
viettrungluu@chromium.org | 7d86af2 | 2013-01-12 00:13:37 +0900 | [diff] [blame] | 199 | return 0; |
| 200 | } |
viettrungluu@chromium.org | 7ca1913 | 2013-01-12 05:56:22 +0900 | [diff] [blame] | 201 | |
| 202 | } // namespace |