blob: 2bf18d440f86cc5c59249a60469aae4510f5d097 [file] [log] [blame]
jdduke@chromium.org03f232f2014-02-26 14:18:04 +09001// Copyright 2014 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
avi42ebda42015-12-22 11:39:04 +09007#include <stddef.h>
8#include <stdint.h>
danakjc3fb6c52016-04-23 13:21:09 +09009#include <memory>
avi42ebda42015-12-22 11:39:04 +090010
gab0a9b7822017-05-13 04:42:56 +090011#include "base/message_loop/message_loop.h"
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090012#include "base/pickle.h"
fdoray284aae52016-06-23 04:56:16 +090013#include "base/run_loop.h"
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090014#include "base/threading/thread.h"
15#include "ipc/ipc_message.h"
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090016#include "ipc/ipc_test_base.h"
dmichael@chromium.orgc0c370e2014-04-25 09:07:30 +090017#include "ipc/message_filter.h"
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090018
jam@chromium.orgfc09dde2014-05-22 01:39:18 +090019// Get basic type definitions.
20#define IPC_MESSAGE_IMPL
21#include "ipc/ipc_channel_proxy_unittest_messages.h"
22
23// Generate constructors.
24#include "ipc/struct_constructor_macros.h"
25#include "ipc/ipc_channel_proxy_unittest_messages.h"
26
27// Generate destructors.
28#include "ipc/struct_destructor_macros.h"
29#include "ipc/ipc_channel_proxy_unittest_messages.h"
30
31// Generate param traits write methods.
32#include "ipc/param_traits_write_macros.h"
33namespace IPC {
34#include "ipc/ipc_channel_proxy_unittest_messages.h"
35} // namespace IPC
36
37// Generate param traits read methods.
38#include "ipc/param_traits_read_macros.h"
39namespace IPC {
40#include "ipc/ipc_channel_proxy_unittest_messages.h"
41} // namespace IPC
42
43// Generate param traits log methods.
44#include "ipc/param_traits_log_macros.h"
45namespace IPC {
46#include "ipc/ipc_channel_proxy_unittest_messages.h"
47} // namespace IPC
48
49
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090050namespace {
51
Weze1bbde02018-02-27 05:50:47 +090052void CreateRunLoopAndRun(base::RunLoop** run_loop_ptr) {
53 base::RunLoop run_loop;
54 *run_loop_ptr = &run_loop;
55 run_loop.Run();
56 *run_loop_ptr = nullptr;
57}
58
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090059class QuitListener : public IPC::Listener {
60 public:
Weze1bbde02018-02-27 05:50:47 +090061 QuitListener() = default;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090062
dchengef7721a2014-10-22 11:29:52 +090063 bool OnMessageReceived(const IPC::Message& message) override {
jam@chromium.orgfc09dde2014-05-22 01:39:18 +090064 IPC_BEGIN_MESSAGE_MAP(QuitListener, message)
65 IPC_MESSAGE_HANDLER(WorkerMsg_Quit, OnQuit)
66 IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage)
67 IPC_END_MESSAGE_MAP()
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090068 return true;
69 }
jam@chromium.orgfc09dde2014-05-22 01:39:18 +090070
dchengef7721a2014-10-22 11:29:52 +090071 void OnBadMessageReceived(const IPC::Message& message) override {
jam@chromium.orgfc09dde2014-05-22 01:39:18 +090072 bad_message_received_ = true;
73 }
74
Weze1bbde02018-02-27 05:50:47 +090075 void OnChannelError() override { CHECK(quit_message_received_); }
76
77 void OnQuit() {
78 quit_message_received_ = true;
79 run_loop_->QuitWhenIdle();
80 }
jam@chromium.orgfc09dde2014-05-22 01:39:18 +090081
82 void OnBadMessage(const BadType& bad_type) {
83 // Should never be called since IPC wouldn't be deserialized correctly.
84 CHECK(false);
85 }
86
Weze1bbde02018-02-27 05:50:47 +090087 bool bad_message_received_ = false;
88 bool quit_message_received_ = false;
89 base::RunLoop* run_loop_ = nullptr;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090090};
91
92class ChannelReflectorListener : public IPC::Listener {
93 public:
Weze1bbde02018-02-27 05:50:47 +090094 ChannelReflectorListener() = default;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +090095
96 void Init(IPC::Channel* channel) {
97 DCHECK(!channel_);
98 channel_ = channel;
99 }
100
dchengef7721a2014-10-22 11:29:52 +0900101 bool OnMessageReceived(const IPC::Message& message) override {
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900102 IPC_BEGIN_MESSAGE_MAP(ChannelReflectorListener, message)
103 IPC_MESSAGE_HANDLER(TestMsg_Bounce, OnTestBounce)
104 IPC_MESSAGE_HANDLER(TestMsg_SendBadMessage, OnSendBadMessage)
Noel Gordonac085112017-07-06 21:48:08 +0900105 IPC_MESSAGE_HANDLER(AutomationMsg_Bounce, OnAutomationBounce)
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900106 IPC_MESSAGE_HANDLER(WorkerMsg_Bounce, OnBounce)
107 IPC_MESSAGE_HANDLER(WorkerMsg_Quit, OnQuit)
108 IPC_END_MESSAGE_MAP()
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900109 return true;
110 }
111
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900112 void OnTestBounce() {
113 channel_->Send(new TestMsg_Bounce());
114 }
115
116 void OnSendBadMessage() {
117 channel_->Send(new TestMsg_BadMessage(BadType()));
118 }
119
Noel Gordonac085112017-07-06 21:48:08 +0900120 void OnAutomationBounce() { channel_->Send(new AutomationMsg_Bounce()); }
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900121
122 void OnBounce() {
123 channel_->Send(new WorkerMsg_Bounce());
124 }
125
126 void OnQuit() {
127 channel_->Send(new WorkerMsg_Quit());
Weze1bbde02018-02-27 05:50:47 +0900128 run_loop_->QuitWhenIdle();
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900129 }
130
Weze1bbde02018-02-27 05:50:47 +0900131 base::RunLoop* run_loop_ = nullptr;
132
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900133 private:
Weze1bbde02018-02-27 05:50:47 +0900134 IPC::Channel* channel_ = nullptr;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900135};
136
dmichael@chromium.orgc0c370e2014-04-25 09:07:30 +0900137class MessageCountFilter : public IPC::MessageFilter {
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900138 public:
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900139 enum FilterEvent {
140 NONE,
141 FILTER_ADDED,
142 CHANNEL_CONNECTED,
143 CHANNEL_ERROR,
144 CHANNEL_CLOSING,
145 FILTER_REMOVED
146 };
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900147
Weze1bbde02018-02-27 05:50:47 +0900148 MessageCountFilter() = default;
tfarina1cbfa082015-09-05 03:47:57 +0900149 MessageCountFilter(uint32_t supported_message_class)
Weze1bbde02018-02-27 05:50:47 +0900150 : supported_message_class_(supported_message_class),
151 is_global_filter_(false) {}
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900152
rockot690fbbe2016-09-17 08:40:30 +0900153 void OnFilterAdded(IPC::Channel* channel) override {
154 EXPECT_TRUE(channel);
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900155 EXPECT_EQ(NONE, last_filter_event_);
156 last_filter_event_ = FILTER_ADDED;
157 }
158
dchengef7721a2014-10-22 11:29:52 +0900159 void OnChannelConnected(int32_t peer_pid) override {
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900160 EXPECT_EQ(FILTER_ADDED, last_filter_event_);
161 EXPECT_NE(static_cast<int32_t>(base::kNullProcessId), peer_pid);
162 last_filter_event_ = CHANNEL_CONNECTED;
163 }
164
dchengef7721a2014-10-22 11:29:52 +0900165 void OnChannelError() override {
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900166 EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
167 last_filter_event_ = CHANNEL_ERROR;
168 }
169
dchengef7721a2014-10-22 11:29:52 +0900170 void OnChannelClosing() override {
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900171 // We may or may not have gotten OnChannelError; if not, the last event has
172 // to be OnChannelConnected.
rockotd76056e2016-10-22 07:47:50 +0900173 EXPECT_NE(FILTER_REMOVED, last_filter_event_);
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900174 if (last_filter_event_ != CHANNEL_ERROR)
175 EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
176 last_filter_event_ = CHANNEL_CLOSING;
177 }
178
dchengef7721a2014-10-22 11:29:52 +0900179 void OnFilterRemoved() override {
rockotd76056e2016-10-22 07:47:50 +0900180 // A filter may be removed at any time, even before the channel is connected
181 // (and thus before OnFilterAdded is ever able to dispatch.) The only time
182 // we won't see OnFilterRemoved is immediately after OnFilterAdded, because
183 // OnChannelConnected is always the next event to fire after that.
184 EXPECT_NE(FILTER_ADDED, last_filter_event_);
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900185 last_filter_event_ = FILTER_REMOVED;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900186 }
187
dchengef7721a2014-10-22 11:29:52 +0900188 bool OnMessageReceived(const IPC::Message& message) override {
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900189 // We should always get the OnFilterAdded and OnChannelConnected events
190 // prior to any messages.
191 EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
192
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900193 if (!is_global_filter_) {
194 EXPECT_EQ(supported_message_class_, IPC_MESSAGE_CLASS(message));
195 }
196 ++messages_received_;
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900197
198 if (!message_filtering_enabled_)
199 return false;
200
201 bool handled = true;
202 IPC_BEGIN_MESSAGE_MAP(MessageCountFilter, message)
203 IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage)
204 IPC_MESSAGE_UNHANDLED(handled = false)
205 IPC_END_MESSAGE_MAP()
206 return handled;
207 }
208
209 void OnBadMessage(const BadType& bad_type) {
210 // Should never be called since IPC wouldn't be deserialized correctly.
211 CHECK(false);
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900212 }
213
dchengef7721a2014-10-22 11:29:52 +0900214 bool GetSupportedMessageClasses(
tfarina1cbfa082015-09-05 03:47:57 +0900215 std::vector<uint32_t>* supported_message_classes) const override {
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900216 if (is_global_filter_)
217 return false;
218 supported_message_classes->push_back(supported_message_class_);
219 return true;
220 }
221
222 void set_message_filtering_enabled(bool enabled) {
223 message_filtering_enabled_ = enabled;
224 }
225
226 size_t messages_received() const { return messages_received_; }
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900227 FilterEvent last_filter_event() const { return last_filter_event_; }
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900228
229 private:
Chris Watkins31bfe1a2017-11-30 11:11:59 +0900230 ~MessageCountFilter() override = default;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900231
Weze1bbde02018-02-27 05:50:47 +0900232 size_t messages_received_ = 0;
233 uint32_t supported_message_class_ = 0;
234 bool is_global_filter_ = true;
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900235
Weze1bbde02018-02-27 05:50:47 +0900236 FilterEvent last_filter_event_ = NONE;
237 bool message_filtering_enabled_ = false;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900238};
239
sammce3cae212016-10-27 19:13:59 +0900240class IPCChannelProxyTest : public IPCChannelMojoTestBase {
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900241 public:
Chris Watkins31bfe1a2017-11-30 11:11:59 +0900242 IPCChannelProxyTest() = default;
243 ~IPCChannelProxyTest() override = default;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900244
dchengcd525762014-12-24 04:59:59 +0900245 void SetUp() override {
sammce3cae212016-10-27 19:13:59 +0900246 IPCChannelMojoTestBase::SetUp();
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900247
248 Init("ChannelProxyClient");
249
250 thread_.reset(new base::Thread("ChannelProxyTestServerThread"));
251 base::Thread::Options options;
252 options.message_loop_type = base::MessageLoop::TYPE_IO;
253 thread_->StartWithOptions(options);
254
255 listener_.reset(new QuitListener());
sammce3cae212016-10-27 19:13:59 +0900256 channel_proxy_ = IPC::ChannelProxy::Create(
257 TakeHandle().release(), IPC::Channel::MODE_SERVER, listener_.get(),
Hajime Hoshi9570c522017-11-09 15:37:09 +0900258 thread_->task_runner(), base::ThreadTaskRunnerHandle::Get());
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900259 }
260
dchengcd525762014-12-24 04:59:59 +0900261 void TearDown() override {
sammce3cae212016-10-27 19:13:59 +0900262 channel_proxy_.reset();
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900263 thread_.reset();
264 listener_.reset();
sammce3cae212016-10-27 19:13:59 +0900265 IPCChannelMojoTestBase::TearDown();
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900266 }
267
268 void SendQuitMessageAndWaitForIdle() {
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900269 sender()->Send(new WorkerMsg_Quit);
Weze1bbde02018-02-27 05:50:47 +0900270 CreateRunLoopAndRun(&listener_->run_loop_);
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900271 EXPECT_TRUE(WaitForClientShutdown());
272 }
273
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900274 bool DidListenerGetBadMessage() {
275 return listener_->bad_message_received_;
276 }
277
sammce3cae212016-10-27 19:13:59 +0900278 IPC::ChannelProxy* channel_proxy() { return channel_proxy_.get(); }
279 IPC::Sender* sender() { return channel_proxy_.get(); }
280
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900281 private:
danakjc3fb6c52016-04-23 13:21:09 +0900282 std::unique_ptr<base::Thread> thread_;
283 std::unique_ptr<QuitListener> listener_;
sammce3cae212016-10-27 19:13:59 +0900284 std::unique_ptr<IPC::ChannelProxy> channel_proxy_;
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900285};
286
amistry87fc78f2016-05-05 14:12:09 +0900287TEST_F(IPCChannelProxyTest, MessageClassFilters) {
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900288 // Construct a filter per message class.
Noel Gordonac085112017-07-06 21:48:08 +0900289 std::vector<scoped_refptr<MessageCountFilter>> class_filters;
290 class_filters.push_back(
kylechar38823cf2017-09-26 05:23:56 +0900291 base::MakeRefCounted<MessageCountFilter>(TestMsgStart));
Noel Gordonac085112017-07-06 21:48:08 +0900292 class_filters.push_back(
kylechar38823cf2017-09-26 05:23:56 +0900293 base::MakeRefCounted<MessageCountFilter>(AutomationMsgStart));
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900294 for (size_t i = 0; i < class_filters.size(); ++i)
295 channel_proxy()->AddFilter(class_filters[i].get());
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900296
297 // Send a message for each class; each filter should receive just one message.
Noel Gordonac085112017-07-06 21:48:08 +0900298 sender()->Send(new TestMsg_Bounce);
299 sender()->Send(new AutomationMsg_Bounce);
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900300
301 // Send some messages not assigned to a specific or valid message class.
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900302 sender()->Send(new WorkerMsg_Bounce);
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900303
304 // Each filter should have received just the one sent message of the
305 // corresponding class.
306 SendQuitMessageAndWaitForIdle();
307 for (size_t i = 0; i < class_filters.size(); ++i)
308 EXPECT_EQ(1U, class_filters[i]->messages_received());
309}
310
amistry87fc78f2016-05-05 14:12:09 +0900311TEST_F(IPCChannelProxyTest, GlobalAndMessageClassFilters) {
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900312 // Add a class and global filter.
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900313 scoped_refptr<MessageCountFilter> class_filter(
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900314 new MessageCountFilter(TestMsgStart));
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900315 class_filter->set_message_filtering_enabled(false);
316 channel_proxy()->AddFilter(class_filter.get());
317
318 scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter());
319 global_filter->set_message_filtering_enabled(false);
320 channel_proxy()->AddFilter(global_filter.get());
321
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900322 // A message of class Test should be seen by both the global filter and
323 // Test-specific filter.
324 sender()->Send(new TestMsg_Bounce);
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900325
326 // A message of a different class should be seen only by the global filter.
Noel Gordonac085112017-07-06 21:48:08 +0900327 sender()->Send(new AutomationMsg_Bounce);
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900328
329 // Flush all messages.
330 SendQuitMessageAndWaitForIdle();
331
332 // The class filter should have received only the class-specific message.
333 EXPECT_EQ(1U, class_filter->messages_received());
334
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900335 // The global filter should have received both messages, as well as the final
336 // QUIT message.
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900337 EXPECT_EQ(3U, global_filter->messages_received());
338}
339
amistry87fc78f2016-05-05 14:12:09 +0900340TEST_F(IPCChannelProxyTest, FilterRemoval) {
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900341 // Add a class and global filter.
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900342 scoped_refptr<MessageCountFilter> class_filter(
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900343 new MessageCountFilter(TestMsgStart));
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900344 scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter());
345
346 // Add and remove both types of filters.
347 channel_proxy()->AddFilter(class_filter.get());
348 channel_proxy()->AddFilter(global_filter.get());
349 channel_proxy()->RemoveFilter(global_filter.get());
350 channel_proxy()->RemoveFilter(class_filter.get());
351
352 // Send some messages; they should not be seen by either filter.
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900353 sender()->Send(new TestMsg_Bounce);
Noel Gordonac085112017-07-06 21:48:08 +0900354 sender()->Send(new AutomationMsg_Bounce);
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900355
356 // Ensure that the filters were removed and did not receive any messages.
357 SendQuitMessageAndWaitForIdle();
dmichael@chromium.org663ad4f2014-04-24 08:54:53 +0900358 EXPECT_EQ(MessageCountFilter::FILTER_REMOVED,
359 global_filter->last_filter_event());
360 EXPECT_EQ(MessageCountFilter::FILTER_REMOVED,
361 class_filter->last_filter_event());
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900362 EXPECT_EQ(0U, class_filter->messages_received());
363 EXPECT_EQ(0U, global_filter->messages_received());
364}
365
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900366TEST_F(IPCChannelProxyTest, BadMessageOnListenerThread) {
367 scoped_refptr<MessageCountFilter> class_filter(
368 new MessageCountFilter(TestMsgStart));
369 class_filter->set_message_filtering_enabled(false);
370 channel_proxy()->AddFilter(class_filter.get());
371
372 sender()->Send(new TestMsg_SendBadMessage());
373
374 SendQuitMessageAndWaitForIdle();
375 EXPECT_TRUE(DidListenerGetBadMessage());
376}
377
378TEST_F(IPCChannelProxyTest, BadMessageOnIPCThread) {
379 scoped_refptr<MessageCountFilter> class_filter(
380 new MessageCountFilter(TestMsgStart));
381 class_filter->set_message_filtering_enabled(true);
382 channel_proxy()->AddFilter(class_filter.get());
383
384 sender()->Send(new TestMsg_SendBadMessage());
385
386 SendQuitMessageAndWaitForIdle();
387 EXPECT_TRUE(DidListenerGetBadMessage());
388}
389
sammce3cae212016-10-27 19:13:59 +0900390class IPCChannelBadMessageTest : public IPCChannelMojoTestBase {
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900391 public:
Daniel Chengc764d4d2014-12-31 12:48:36 +0900392 void SetUp() override {
sammce3cae212016-10-27 19:13:59 +0900393 IPCChannelMojoTestBase::SetUp();
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900394
395 Init("ChannelProxyClient");
396
397 listener_.reset(new QuitListener());
398 CreateChannel(listener_.get());
399 ASSERT_TRUE(ConnectChannel());
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900400 }
401
Daniel Chengc764d4d2014-12-31 12:48:36 +0900402 void TearDown() override {
sammce3cae212016-10-27 19:13:59 +0900403 IPCChannelMojoTestBase::TearDown();
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900404 listener_.reset();
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900405 }
406
407 void SendQuitMessageAndWaitForIdle() {
408 sender()->Send(new WorkerMsg_Quit);
Weze1bbde02018-02-27 05:50:47 +0900409 CreateRunLoopAndRun(&listener_->run_loop_);
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900410 EXPECT_TRUE(WaitForClientShutdown());
411 }
412
413 bool DidListenerGetBadMessage() {
414 return listener_->bad_message_received_;
415 }
416
417 private:
danakjc3fb6c52016-04-23 13:21:09 +0900418 std::unique_ptr<QuitListener> listener_;
jam@chromium.orgfc09dde2014-05-22 01:39:18 +0900419};
420
421TEST_F(IPCChannelBadMessageTest, BadMessage) {
422 sender()->Send(new TestMsg_SendBadMessage());
423 SendQuitMessageAndWaitForIdle();
424 EXPECT_TRUE(DidListenerGetBadMessage());
425}
426
sammce3cae212016-10-27 19:13:59 +0900427DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ChannelProxyClient) {
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900428 ChannelReflectorListener listener;
sammce3cae212016-10-27 19:13:59 +0900429 Connect(&listener);
430 listener.Init(channel());
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900431
Weze1bbde02018-02-27 05:50:47 +0900432 CreateRunLoopAndRun(&listener.run_loop_);
433
sammce3cae212016-10-27 19:13:59 +0900434 Close();
jdduke@chromium.org03f232f2014-02-26 14:18:04 +0900435}
436
437} // namespace