[go: nahoru, domu]

blob: 0a9ccfbe9d1f6f79e423ba4526bbe5a2daa5d653 [file] [log] [blame]
Avi Drissmanea1be232022-09-14 23:29:061// Copyright 2014 The Chromium Authors
jdduke@chromium.orgb51352a2014-02-26 05:18:042// 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
avi246998d2015-12-22 02:39:047#include <stddef.h>
8#include <stdint.h>
danakj03de39b2016-04-23 04:21:099#include <memory>
avi246998d2015-12-22 02:39:0410
Carlos Caballerodd8bf7b02019-07-30 14:14:1511#include "base/message_loop/message_pump_type.h"
jdduke@chromium.orgb51352a2014-02-26 05:18:0412#include "base/pickle.h"
fdoray8e32586852016-06-22 19:56:1613#include "base/run_loop.h"
jdduke@chromium.orgb51352a2014-02-26 05:18:0414#include "base/threading/thread.h"
15#include "ipc/ipc_message.h"
jdduke@chromium.orgb51352a2014-02-26 05:18:0416#include "ipc/ipc_test_base.h"
dmichael@chromium.org74122042014-04-25 00:07:3017#include "ipc/message_filter.h"
jdduke@chromium.orgb51352a2014-02-26 05:18:0418
jam@chromium.org8e9ba762014-05-21 16:39:1819// 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
jam@chromium.org8e9ba762014-05-21 16:39:1827// Generate param traits write methods.
28#include "ipc/param_traits_write_macros.h"
29namespace IPC {
30#include "ipc/ipc_channel_proxy_unittest_messages.h"
31} // namespace IPC
32
33// Generate param traits read methods.
34#include "ipc/param_traits_read_macros.h"
35namespace IPC {
36#include "ipc/ipc_channel_proxy_unittest_messages.h"
37} // namespace IPC
38
39// Generate param traits log methods.
40#include "ipc/param_traits_log_macros.h"
41namespace IPC {
42#include "ipc/ipc_channel_proxy_unittest_messages.h"
43} // namespace IPC
44
45
jdduke@chromium.orgb51352a2014-02-26 05:18:0446namespace {
47
Wezd95d48042018-02-26 20:50:4748void CreateRunLoopAndRun(base::RunLoop** run_loop_ptr) {
49 base::RunLoop run_loop;
50 *run_loop_ptr = &run_loop;
51 run_loop.Run();
52 *run_loop_ptr = nullptr;
53}
54
jdduke@chromium.orgb51352a2014-02-26 05:18:0455class QuitListener : public IPC::Listener {
56 public:
Wezd95d48042018-02-26 20:50:4757 QuitListener() = default;
jdduke@chromium.orgb51352a2014-02-26 05:18:0458
dchengfe61fca2014-10-22 02:29:5259 bool OnMessageReceived(const IPC::Message& message) override {
jam@chromium.org8e9ba762014-05-21 16:39:1860 IPC_BEGIN_MESSAGE_MAP(QuitListener, message)
61 IPC_MESSAGE_HANDLER(WorkerMsg_Quit, OnQuit)
62 IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage)
63 IPC_END_MESSAGE_MAP()
jdduke@chromium.orgb51352a2014-02-26 05:18:0464 return true;
65 }
jam@chromium.org8e9ba762014-05-21 16:39:1866
dchengfe61fca2014-10-22 02:29:5267 void OnBadMessageReceived(const IPC::Message& message) override {
jam@chromium.org8e9ba762014-05-21 16:39:1868 bad_message_received_ = true;
69 }
70
Wezd95d48042018-02-26 20:50:4771 void OnChannelError() override { CHECK(quit_message_received_); }
72
73 void OnQuit() {
74 quit_message_received_ = true;
75 run_loop_->QuitWhenIdle();
76 }
jam@chromium.org8e9ba762014-05-21 16:39:1877
78 void OnBadMessage(const BadType& bad_type) {
79 // Should never be called since IPC wouldn't be deserialized correctly.
80 CHECK(false);
81 }
82
Wezd95d48042018-02-26 20:50:4783 bool bad_message_received_ = false;
84 bool quit_message_received_ = false;
85 base::RunLoop* run_loop_ = nullptr;
jdduke@chromium.orgb51352a2014-02-26 05:18:0486};
87
88class ChannelReflectorListener : public IPC::Listener {
89 public:
Wezd95d48042018-02-26 20:50:4790 ChannelReflectorListener() = default;
jdduke@chromium.orgb51352a2014-02-26 05:18:0491
92 void Init(IPC::Channel* channel) {
93 DCHECK(!channel_);
94 channel_ = channel;
95 }
96
dchengfe61fca2014-10-22 02:29:5297 bool OnMessageReceived(const IPC::Message& message) override {
jam@chromium.org8e9ba762014-05-21 16:39:1898 IPC_BEGIN_MESSAGE_MAP(ChannelReflectorListener, message)
99 IPC_MESSAGE_HANDLER(TestMsg_Bounce, OnTestBounce)
100 IPC_MESSAGE_HANDLER(TestMsg_SendBadMessage, OnSendBadMessage)
Noel Gordon93d53af2017-07-06 12:48:08101 IPC_MESSAGE_HANDLER(AutomationMsg_Bounce, OnAutomationBounce)
jam@chromium.org8e9ba762014-05-21 16:39:18102 IPC_MESSAGE_HANDLER(WorkerMsg_Bounce, OnBounce)
103 IPC_MESSAGE_HANDLER(WorkerMsg_Quit, OnQuit)
104 IPC_END_MESSAGE_MAP()
jdduke@chromium.orgb51352a2014-02-26 05:18:04105 return true;
106 }
107
jam@chromium.org8e9ba762014-05-21 16:39:18108 void OnTestBounce() {
109 channel_->Send(new TestMsg_Bounce());
110 }
111
112 void OnSendBadMessage() {
113 channel_->Send(new TestMsg_BadMessage(BadType()));
114 }
115
Noel Gordon93d53af2017-07-06 12:48:08116 void OnAutomationBounce() { channel_->Send(new AutomationMsg_Bounce()); }
jam@chromium.org8e9ba762014-05-21 16:39:18117
118 void OnBounce() {
119 channel_->Send(new WorkerMsg_Bounce());
120 }
121
122 void OnQuit() {
123 channel_->Send(new WorkerMsg_Quit());
Wezd95d48042018-02-26 20:50:47124 run_loop_->QuitWhenIdle();
jam@chromium.org8e9ba762014-05-21 16:39:18125 }
126
Wezd95d48042018-02-26 20:50:47127 base::RunLoop* run_loop_ = nullptr;
128
jdduke@chromium.orgb51352a2014-02-26 05:18:04129 private:
Wezd95d48042018-02-26 20:50:47130 IPC::Channel* channel_ = nullptr;
jdduke@chromium.orgb51352a2014-02-26 05:18:04131};
132
dmichael@chromium.org74122042014-04-25 00:07:30133class MessageCountFilter : public IPC::MessageFilter {
jdduke@chromium.orgb51352a2014-02-26 05:18:04134 public:
dmichael@chromium.org21bb77b2014-04-23 23:54:53135 enum FilterEvent {
136 NONE,
137 FILTER_ADDED,
138 CHANNEL_CONNECTED,
139 CHANNEL_ERROR,
140 CHANNEL_CLOSING,
141 FILTER_REMOVED
142 };
jdduke@chromium.orgb51352a2014-02-26 05:18:04143
Wezd95d48042018-02-26 20:50:47144 MessageCountFilter() = default;
tfarina10a5c062015-09-04 18:47:57145 MessageCountFilter(uint32_t supported_message_class)
Wezd95d48042018-02-26 20:50:47146 : supported_message_class_(supported_message_class),
147 is_global_filter_(false) {}
jdduke@chromium.orgb51352a2014-02-26 05:18:04148
rockote0072ebd2016-09-16 23:40:30149 void OnFilterAdded(IPC::Channel* channel) override {
150 EXPECT_TRUE(channel);
dmichael@chromium.org21bb77b2014-04-23 23:54:53151 EXPECT_EQ(NONE, last_filter_event_);
152 last_filter_event_ = FILTER_ADDED;
153 }
154
dchengfe61fca2014-10-22 02:29:52155 void OnChannelConnected(int32_t peer_pid) override {
dmichael@chromium.org21bb77b2014-04-23 23:54:53156 EXPECT_EQ(FILTER_ADDED, last_filter_event_);
157 EXPECT_NE(static_cast<int32_t>(base::kNullProcessId), peer_pid);
158 last_filter_event_ = CHANNEL_CONNECTED;
159 }
160
dchengfe61fca2014-10-22 02:29:52161 void OnChannelError() override {
dmichael@chromium.org21bb77b2014-04-23 23:54:53162 EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
163 last_filter_event_ = CHANNEL_ERROR;
164 }
165
dchengfe61fca2014-10-22 02:29:52166 void OnChannelClosing() override {
dmichael@chromium.org21bb77b2014-04-23 23:54:53167 // We may or may not have gotten OnChannelError; if not, the last event has
168 // to be OnChannelConnected.
rockot8a96cca42016-10-21 22:47:50169 EXPECT_NE(FILTER_REMOVED, last_filter_event_);
dmichael@chromium.org21bb77b2014-04-23 23:54:53170 if (last_filter_event_ != CHANNEL_ERROR)
171 EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
172 last_filter_event_ = CHANNEL_CLOSING;
173 }
174
dchengfe61fca2014-10-22 02:29:52175 void OnFilterRemoved() override {
rockot8a96cca42016-10-21 22:47:50176 // A filter may be removed at any time, even before the channel is connected
177 // (and thus before OnFilterAdded is ever able to dispatch.) The only time
178 // we won't see OnFilterRemoved is immediately after OnFilterAdded, because
179 // OnChannelConnected is always the next event to fire after that.
180 EXPECT_NE(FILTER_ADDED, last_filter_event_);
dmichael@chromium.org21bb77b2014-04-23 23:54:53181 last_filter_event_ = FILTER_REMOVED;
jdduke@chromium.orgb51352a2014-02-26 05:18:04182 }
183
dchengfe61fca2014-10-22 02:29:52184 bool OnMessageReceived(const IPC::Message& message) override {
dmichael@chromium.org21bb77b2014-04-23 23:54:53185 // We should always get the OnFilterAdded and OnChannelConnected events
186 // prior to any messages.
187 EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
188
jdduke@chromium.orgb51352a2014-02-26 05:18:04189 if (!is_global_filter_) {
190 EXPECT_EQ(supported_message_class_, IPC_MESSAGE_CLASS(message));
191 }
192 ++messages_received_;
jam@chromium.org8e9ba762014-05-21 16:39:18193
194 if (!message_filtering_enabled_)
195 return false;
196
197 bool handled = true;
198 IPC_BEGIN_MESSAGE_MAP(MessageCountFilter, message)
199 IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage)
200 IPC_MESSAGE_UNHANDLED(handled = false)
201 IPC_END_MESSAGE_MAP()
202 return handled;
203 }
204
205 void OnBadMessage(const BadType& bad_type) {
206 // Should never be called since IPC wouldn't be deserialized correctly.
207 CHECK(false);
jdduke@chromium.orgb51352a2014-02-26 05:18:04208 }
209
dchengfe61fca2014-10-22 02:29:52210 bool GetSupportedMessageClasses(
tfarina10a5c062015-09-04 18:47:57211 std::vector<uint32_t>* supported_message_classes) const override {
jdduke@chromium.orgb51352a2014-02-26 05:18:04212 if (is_global_filter_)
213 return false;
214 supported_message_classes->push_back(supported_message_class_);
215 return true;
216 }
217
218 void set_message_filtering_enabled(bool enabled) {
219 message_filtering_enabled_ = enabled;
220 }
221
222 size_t messages_received() const { return messages_received_; }
dmichael@chromium.org21bb77b2014-04-23 23:54:53223 FilterEvent last_filter_event() const { return last_filter_event_; }
jdduke@chromium.orgb51352a2014-02-26 05:18:04224
225 private:
Chris Watkins2d879af2017-11-30 02:11:59226 ~MessageCountFilter() override = default;
jdduke@chromium.orgb51352a2014-02-26 05:18:04227
Wezd95d48042018-02-26 20:50:47228 size_t messages_received_ = 0;
229 uint32_t supported_message_class_ = 0;
230 bool is_global_filter_ = true;
dmichael@chromium.org21bb77b2014-04-23 23:54:53231
Wezd95d48042018-02-26 20:50:47232 FilterEvent last_filter_event_ = NONE;
233 bool message_filtering_enabled_ = false;
jdduke@chromium.orgb51352a2014-02-26 05:18:04234};
235
sammc4bcc4ed62016-10-27 10:13:59236class IPCChannelProxyTest : public IPCChannelMojoTestBase {
jdduke@chromium.orgb51352a2014-02-26 05:18:04237 public:
Chris Watkins2d879af2017-11-30 02:11:59238 IPCChannelProxyTest() = default;
239 ~IPCChannelProxyTest() override = default;
jdduke@chromium.orgb51352a2014-02-26 05:18:04240
dcheng1c3d9ac2014-12-23 19:59:59241 void SetUp() override {
sammc4bcc4ed62016-10-27 10:13:59242 IPCChannelMojoTestBase::SetUp();
jdduke@chromium.orgb51352a2014-02-26 05:18:04243
244 Init("ChannelProxyClient");
245
Peter Boströmfb60ea02021-04-05 21:06:12246 thread_ = std::make_unique<base::Thread>("ChannelProxyTestServerThread");
jdduke@chromium.orgb51352a2014-02-26 05:18:04247 base::Thread::Options options;
Carlos Caballerodd8bf7b02019-07-30 14:14:15248 options.message_pump_type = base::MessagePumpType::IO;
Olivier Li81862b82021-05-12 15:36:41249 thread_->StartWithOptions(std::move(options));
jdduke@chromium.orgb51352a2014-02-26 05:18:04250
Peter Boströmfb60ea02021-04-05 21:06:12251 listener_ = std::make_unique<QuitListener>();
sammc4bcc4ed62016-10-27 10:13:59252 channel_proxy_ = IPC::ChannelProxy::Create(
253 TakeHandle().release(), IPC::Channel::MODE_SERVER, listener_.get(),
Sean Maher5b9af51f2022-11-21 15:32:47254 thread_->task_runner(),
255 base::SingleThreadTaskRunner::GetCurrentDefault());
jdduke@chromium.orgb51352a2014-02-26 05:18:04256 }
257
dcheng1c3d9ac2014-12-23 19:59:59258 void TearDown() override {
sammc4bcc4ed62016-10-27 10:13:59259 channel_proxy_.reset();
jdduke@chromium.orgb51352a2014-02-26 05:18:04260 thread_.reset();
261 listener_.reset();
sammc4bcc4ed62016-10-27 10:13:59262 IPCChannelMojoTestBase::TearDown();
jdduke@chromium.orgb51352a2014-02-26 05:18:04263 }
264
265 void SendQuitMessageAndWaitForIdle() {
jam@chromium.org8e9ba762014-05-21 16:39:18266 sender()->Send(new WorkerMsg_Quit);
Wezd95d48042018-02-26 20:50:47267 CreateRunLoopAndRun(&listener_->run_loop_);
jdduke@chromium.orgb51352a2014-02-26 05:18:04268 EXPECT_TRUE(WaitForClientShutdown());
269 }
270
jam@chromium.org8e9ba762014-05-21 16:39:18271 bool DidListenerGetBadMessage() {
272 return listener_->bad_message_received_;
273 }
274
sammc4bcc4ed62016-10-27 10:13:59275 IPC::ChannelProxy* channel_proxy() { return channel_proxy_.get(); }
276 IPC::Sender* sender() { return channel_proxy_.get(); }
277
jdduke@chromium.orgb51352a2014-02-26 05:18:04278 private:
danakj03de39b2016-04-23 04:21:09279 std::unique_ptr<base::Thread> thread_;
280 std::unique_ptr<QuitListener> listener_;
sammc4bcc4ed62016-10-27 10:13:59281 std::unique_ptr<IPC::ChannelProxy> channel_proxy_;
jdduke@chromium.orgb51352a2014-02-26 05:18:04282};
283
amistry6de2ee4f2016-05-05 05:12:09284TEST_F(IPCChannelProxyTest, MessageClassFilters) {
jdduke@chromium.orgb51352a2014-02-26 05:18:04285 // Construct a filter per message class.
Noel Gordon93d53af2017-07-06 12:48:08286 std::vector<scoped_refptr<MessageCountFilter>> class_filters;
287 class_filters.push_back(
kylechar96f3eba2017-09-25 20:23:56288 base::MakeRefCounted<MessageCountFilter>(TestMsgStart));
Noel Gordon93d53af2017-07-06 12:48:08289 class_filters.push_back(
kylechar96f3eba2017-09-25 20:23:56290 base::MakeRefCounted<MessageCountFilter>(AutomationMsgStart));
jam@chromium.org8e9ba762014-05-21 16:39:18291 for (size_t i = 0; i < class_filters.size(); ++i)
292 channel_proxy()->AddFilter(class_filters[i].get());
jdduke@chromium.orgb51352a2014-02-26 05:18:04293
294 // Send a message for each class; each filter should receive just one message.
Noel Gordon93d53af2017-07-06 12:48:08295 sender()->Send(new TestMsg_Bounce);
296 sender()->Send(new AutomationMsg_Bounce);
jdduke@chromium.orgb51352a2014-02-26 05:18:04297
298 // Send some messages not assigned to a specific or valid message class.
jam@chromium.org8e9ba762014-05-21 16:39:18299 sender()->Send(new WorkerMsg_Bounce);
jdduke@chromium.orgb51352a2014-02-26 05:18:04300
301 // Each filter should have received just the one sent message of the
302 // corresponding class.
303 SendQuitMessageAndWaitForIdle();
304 for (size_t i = 0; i < class_filters.size(); ++i)
305 EXPECT_EQ(1U, class_filters[i]->messages_received());
306}
307
amistry6de2ee4f2016-05-05 05:12:09308TEST_F(IPCChannelProxyTest, GlobalAndMessageClassFilters) {
jdduke@chromium.orgb51352a2014-02-26 05:18:04309 // Add a class and global filter.
jdduke@chromium.orgb51352a2014-02-26 05:18:04310 scoped_refptr<MessageCountFilter> class_filter(
jam@chromium.org8e9ba762014-05-21 16:39:18311 new MessageCountFilter(TestMsgStart));
jdduke@chromium.orgb51352a2014-02-26 05:18:04312 class_filter->set_message_filtering_enabled(false);
313 channel_proxy()->AddFilter(class_filter.get());
314
315 scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter());
316 global_filter->set_message_filtering_enabled(false);
317 channel_proxy()->AddFilter(global_filter.get());
318
jam@chromium.org8e9ba762014-05-21 16:39:18319 // A message of class Test should be seen by both the global filter and
320 // Test-specific filter.
321 sender()->Send(new TestMsg_Bounce);
jdduke@chromium.orgb51352a2014-02-26 05:18:04322
323 // A message of a different class should be seen only by the global filter.
Noel Gordon93d53af2017-07-06 12:48:08324 sender()->Send(new AutomationMsg_Bounce);
jdduke@chromium.orgb51352a2014-02-26 05:18:04325
326 // Flush all messages.
327 SendQuitMessageAndWaitForIdle();
328
329 // The class filter should have received only the class-specific message.
330 EXPECT_EQ(1U, class_filter->messages_received());
331
jam@chromium.org8e9ba762014-05-21 16:39:18332 // The global filter should have received both messages, as well as the final
333 // QUIT message.
jdduke@chromium.orgb51352a2014-02-26 05:18:04334 EXPECT_EQ(3U, global_filter->messages_received());
335}
336
amistry6de2ee4f2016-05-05 05:12:09337TEST_F(IPCChannelProxyTest, FilterRemoval) {
jdduke@chromium.orgb51352a2014-02-26 05:18:04338 // Add a class and global filter.
jdduke@chromium.orgb51352a2014-02-26 05:18:04339 scoped_refptr<MessageCountFilter> class_filter(
jam@chromium.org8e9ba762014-05-21 16:39:18340 new MessageCountFilter(TestMsgStart));
jdduke@chromium.orgb51352a2014-02-26 05:18:04341 scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter());
342
343 // Add and remove both types of filters.
344 channel_proxy()->AddFilter(class_filter.get());
345 channel_proxy()->AddFilter(global_filter.get());
346 channel_proxy()->RemoveFilter(global_filter.get());
347 channel_proxy()->RemoveFilter(class_filter.get());
348
349 // Send some messages; they should not be seen by either filter.
jam@chromium.org8e9ba762014-05-21 16:39:18350 sender()->Send(new TestMsg_Bounce);
Noel Gordon93d53af2017-07-06 12:48:08351 sender()->Send(new AutomationMsg_Bounce);
jdduke@chromium.orgb51352a2014-02-26 05:18:04352
353 // Ensure that the filters were removed and did not receive any messages.
354 SendQuitMessageAndWaitForIdle();
dmichael@chromium.org21bb77b2014-04-23 23:54:53355 EXPECT_EQ(MessageCountFilter::FILTER_REMOVED,
356 global_filter->last_filter_event());
357 EXPECT_EQ(MessageCountFilter::FILTER_REMOVED,
358 class_filter->last_filter_event());
jdduke@chromium.orgb51352a2014-02-26 05:18:04359 EXPECT_EQ(0U, class_filter->messages_received());
360 EXPECT_EQ(0U, global_filter->messages_received());
361}
362
jam@chromium.org8e9ba762014-05-21 16:39:18363TEST_F(IPCChannelProxyTest, BadMessageOnListenerThread) {
364 scoped_refptr<MessageCountFilter> class_filter(
365 new MessageCountFilter(TestMsgStart));
366 class_filter->set_message_filtering_enabled(false);
367 channel_proxy()->AddFilter(class_filter.get());
368
369 sender()->Send(new TestMsg_SendBadMessage());
370
371 SendQuitMessageAndWaitForIdle();
372 EXPECT_TRUE(DidListenerGetBadMessage());
373}
374
375TEST_F(IPCChannelProxyTest, BadMessageOnIPCThread) {
376 scoped_refptr<MessageCountFilter> class_filter(
377 new MessageCountFilter(TestMsgStart));
378 class_filter->set_message_filtering_enabled(true);
379 channel_proxy()->AddFilter(class_filter.get());
380
381 sender()->Send(new TestMsg_SendBadMessage());
382
383 SendQuitMessageAndWaitForIdle();
384 EXPECT_TRUE(DidListenerGetBadMessage());
385}
386
sammc4bcc4ed62016-10-27 10:13:59387class IPCChannelBadMessageTest : public IPCChannelMojoTestBase {
jam@chromium.org8e9ba762014-05-21 16:39:18388 public:
Daniel Cheng3e6beaa72014-12-31 03:48:36389 void SetUp() override {
sammc4bcc4ed62016-10-27 10:13:59390 IPCChannelMojoTestBase::SetUp();
jam@chromium.org8e9ba762014-05-21 16:39:18391
392 Init("ChannelProxyClient");
393
Peter Boströmfb60ea02021-04-05 21:06:12394 listener_ = std::make_unique<QuitListener>();
jam@chromium.org8e9ba762014-05-21 16:39:18395 CreateChannel(listener_.get());
396 ASSERT_TRUE(ConnectChannel());
jam@chromium.org8e9ba762014-05-21 16:39:18397 }
398
Daniel Cheng3e6beaa72014-12-31 03:48:36399 void TearDown() override {
sammc4bcc4ed62016-10-27 10:13:59400 IPCChannelMojoTestBase::TearDown();
jam@chromium.org8e9ba762014-05-21 16:39:18401 listener_.reset();
jam@chromium.org8e9ba762014-05-21 16:39:18402 }
403
404 void SendQuitMessageAndWaitForIdle() {
405 sender()->Send(new WorkerMsg_Quit);
Wezd95d48042018-02-26 20:50:47406 CreateRunLoopAndRun(&listener_->run_loop_);
jam@chromium.org8e9ba762014-05-21 16:39:18407 EXPECT_TRUE(WaitForClientShutdown());
408 }
409
410 bool DidListenerGetBadMessage() {
411 return listener_->bad_message_received_;
412 }
413
414 private:
danakj03de39b2016-04-23 04:21:09415 std::unique_ptr<QuitListener> listener_;
jam@chromium.org8e9ba762014-05-21 16:39:18416};
417
418TEST_F(IPCChannelBadMessageTest, BadMessage) {
419 sender()->Send(new TestMsg_SendBadMessage());
420 SendQuitMessageAndWaitForIdle();
421 EXPECT_TRUE(DidListenerGetBadMessage());
422}
423
sammc4bcc4ed62016-10-27 10:13:59424DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ChannelProxyClient) {
jdduke@chromium.orgb51352a2014-02-26 05:18:04425 ChannelReflectorListener listener;
sammc4bcc4ed62016-10-27 10:13:59426 Connect(&listener);
427 listener.Init(channel());
jdduke@chromium.orgb51352a2014-02-26 05:18:04428
Wezd95d48042018-02-26 20:50:47429 CreateRunLoopAndRun(&listener.run_loop_);
430
sammc4bcc4ed62016-10-27 10:13:59431 Close();
jdduke@chromium.orgb51352a2014-02-26 05:18:04432}
433
434} // namespace