1*635a8641SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
8*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
9*635a8641SAndroid Build Coastguard Worker #include <memory>
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker #include "base/message_loop/message_loop.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/pickle.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/run_loop.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread.h"
15*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_message.h"
16*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_test_base.h"
17*635a8641SAndroid Build Coastguard Worker #include "ipc/message_filter.h"
18*635a8641SAndroid Build Coastguard Worker
19*635a8641SAndroid Build Coastguard Worker // Get basic type definitions.
20*635a8641SAndroid Build Coastguard Worker #define IPC_MESSAGE_IMPL
21*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_channel_proxy_unittest_messages.h"
22*635a8641SAndroid Build Coastguard Worker
23*635a8641SAndroid Build Coastguard Worker // Generate constructors.
24*635a8641SAndroid Build Coastguard Worker #include "ipc/struct_constructor_macros.h"
25*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_channel_proxy_unittest_messages.h"
26*635a8641SAndroid Build Coastguard Worker
27*635a8641SAndroid Build Coastguard Worker // Generate destructors.
28*635a8641SAndroid Build Coastguard Worker #include "ipc/struct_destructor_macros.h"
29*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_channel_proxy_unittest_messages.h"
30*635a8641SAndroid Build Coastguard Worker
31*635a8641SAndroid Build Coastguard Worker // Generate param traits write methods.
32*635a8641SAndroid Build Coastguard Worker #include "ipc/param_traits_write_macros.h"
33*635a8641SAndroid Build Coastguard Worker namespace IPC {
34*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_channel_proxy_unittest_messages.h"
35*635a8641SAndroid Build Coastguard Worker } // namespace IPC
36*635a8641SAndroid Build Coastguard Worker
37*635a8641SAndroid Build Coastguard Worker // Generate param traits read methods.
38*635a8641SAndroid Build Coastguard Worker #include "ipc/param_traits_read_macros.h"
39*635a8641SAndroid Build Coastguard Worker namespace IPC {
40*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_channel_proxy_unittest_messages.h"
41*635a8641SAndroid Build Coastguard Worker } // namespace IPC
42*635a8641SAndroid Build Coastguard Worker
43*635a8641SAndroid Build Coastguard Worker // Generate param traits log methods.
44*635a8641SAndroid Build Coastguard Worker #include "ipc/param_traits_log_macros.h"
45*635a8641SAndroid Build Coastguard Worker namespace IPC {
46*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_channel_proxy_unittest_messages.h"
47*635a8641SAndroid Build Coastguard Worker } // namespace IPC
48*635a8641SAndroid Build Coastguard Worker
49*635a8641SAndroid Build Coastguard Worker
50*635a8641SAndroid Build Coastguard Worker namespace {
51*635a8641SAndroid Build Coastguard Worker
CreateRunLoopAndRun(base::RunLoop ** run_loop_ptr)52*635a8641SAndroid Build Coastguard Worker void CreateRunLoopAndRun(base::RunLoop** run_loop_ptr) {
53*635a8641SAndroid Build Coastguard Worker base::RunLoop run_loop;
54*635a8641SAndroid Build Coastguard Worker *run_loop_ptr = &run_loop;
55*635a8641SAndroid Build Coastguard Worker run_loop.Run();
56*635a8641SAndroid Build Coastguard Worker *run_loop_ptr = nullptr;
57*635a8641SAndroid Build Coastguard Worker }
58*635a8641SAndroid Build Coastguard Worker
59*635a8641SAndroid Build Coastguard Worker class QuitListener : public IPC::Listener {
60*635a8641SAndroid Build Coastguard Worker public:
61*635a8641SAndroid Build Coastguard Worker QuitListener() = default;
62*635a8641SAndroid Build Coastguard Worker
OnMessageReceived(const IPC::Message & message)63*635a8641SAndroid Build Coastguard Worker bool OnMessageReceived(const IPC::Message& message) override {
64*635a8641SAndroid Build Coastguard Worker IPC_BEGIN_MESSAGE_MAP(QuitListener, message)
65*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(WorkerMsg_Quit, OnQuit)
66*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage)
67*635a8641SAndroid Build Coastguard Worker IPC_END_MESSAGE_MAP()
68*635a8641SAndroid Build Coastguard Worker return true;
69*635a8641SAndroid Build Coastguard Worker }
70*635a8641SAndroid Build Coastguard Worker
OnBadMessageReceived(const IPC::Message & message)71*635a8641SAndroid Build Coastguard Worker void OnBadMessageReceived(const IPC::Message& message) override {
72*635a8641SAndroid Build Coastguard Worker bad_message_received_ = true;
73*635a8641SAndroid Build Coastguard Worker }
74*635a8641SAndroid Build Coastguard Worker
OnChannelError()75*635a8641SAndroid Build Coastguard Worker void OnChannelError() override { CHECK(quit_message_received_); }
76*635a8641SAndroid Build Coastguard Worker
OnQuit()77*635a8641SAndroid Build Coastguard Worker void OnQuit() {
78*635a8641SAndroid Build Coastguard Worker quit_message_received_ = true;
79*635a8641SAndroid Build Coastguard Worker run_loop_->QuitWhenIdle();
80*635a8641SAndroid Build Coastguard Worker }
81*635a8641SAndroid Build Coastguard Worker
OnBadMessage(const BadType & bad_type)82*635a8641SAndroid Build Coastguard Worker void OnBadMessage(const BadType& bad_type) {
83*635a8641SAndroid Build Coastguard Worker // Should never be called since IPC wouldn't be deserialized correctly.
84*635a8641SAndroid Build Coastguard Worker CHECK(false);
85*635a8641SAndroid Build Coastguard Worker }
86*635a8641SAndroid Build Coastguard Worker
87*635a8641SAndroid Build Coastguard Worker bool bad_message_received_ = false;
88*635a8641SAndroid Build Coastguard Worker bool quit_message_received_ = false;
89*635a8641SAndroid Build Coastguard Worker base::RunLoop* run_loop_ = nullptr;
90*635a8641SAndroid Build Coastguard Worker };
91*635a8641SAndroid Build Coastguard Worker
92*635a8641SAndroid Build Coastguard Worker class ChannelReflectorListener : public IPC::Listener {
93*635a8641SAndroid Build Coastguard Worker public:
94*635a8641SAndroid Build Coastguard Worker ChannelReflectorListener() = default;
95*635a8641SAndroid Build Coastguard Worker
Init(IPC::Channel * channel)96*635a8641SAndroid Build Coastguard Worker void Init(IPC::Channel* channel) {
97*635a8641SAndroid Build Coastguard Worker DCHECK(!channel_);
98*635a8641SAndroid Build Coastguard Worker channel_ = channel;
99*635a8641SAndroid Build Coastguard Worker }
100*635a8641SAndroid Build Coastguard Worker
OnMessageReceived(const IPC::Message & message)101*635a8641SAndroid Build Coastguard Worker bool OnMessageReceived(const IPC::Message& message) override {
102*635a8641SAndroid Build Coastguard Worker IPC_BEGIN_MESSAGE_MAP(ChannelReflectorListener, message)
103*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(TestMsg_Bounce, OnTestBounce)
104*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(TestMsg_SendBadMessage, OnSendBadMessage)
105*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(AutomationMsg_Bounce, OnAutomationBounce)
106*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(WorkerMsg_Bounce, OnBounce)
107*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(WorkerMsg_Quit, OnQuit)
108*635a8641SAndroid Build Coastguard Worker IPC_END_MESSAGE_MAP()
109*635a8641SAndroid Build Coastguard Worker return true;
110*635a8641SAndroid Build Coastguard Worker }
111*635a8641SAndroid Build Coastguard Worker
OnTestBounce()112*635a8641SAndroid Build Coastguard Worker void OnTestBounce() {
113*635a8641SAndroid Build Coastguard Worker channel_->Send(new TestMsg_Bounce());
114*635a8641SAndroid Build Coastguard Worker }
115*635a8641SAndroid Build Coastguard Worker
OnSendBadMessage()116*635a8641SAndroid Build Coastguard Worker void OnSendBadMessage() {
117*635a8641SAndroid Build Coastguard Worker channel_->Send(new TestMsg_BadMessage(BadType()));
118*635a8641SAndroid Build Coastguard Worker }
119*635a8641SAndroid Build Coastguard Worker
OnAutomationBounce()120*635a8641SAndroid Build Coastguard Worker void OnAutomationBounce() { channel_->Send(new AutomationMsg_Bounce()); }
121*635a8641SAndroid Build Coastguard Worker
OnBounce()122*635a8641SAndroid Build Coastguard Worker void OnBounce() {
123*635a8641SAndroid Build Coastguard Worker channel_->Send(new WorkerMsg_Bounce());
124*635a8641SAndroid Build Coastguard Worker }
125*635a8641SAndroid Build Coastguard Worker
OnQuit()126*635a8641SAndroid Build Coastguard Worker void OnQuit() {
127*635a8641SAndroid Build Coastguard Worker channel_->Send(new WorkerMsg_Quit());
128*635a8641SAndroid Build Coastguard Worker run_loop_->QuitWhenIdle();
129*635a8641SAndroid Build Coastguard Worker }
130*635a8641SAndroid Build Coastguard Worker
131*635a8641SAndroid Build Coastguard Worker base::RunLoop* run_loop_ = nullptr;
132*635a8641SAndroid Build Coastguard Worker
133*635a8641SAndroid Build Coastguard Worker private:
134*635a8641SAndroid Build Coastguard Worker IPC::Channel* channel_ = nullptr;
135*635a8641SAndroid Build Coastguard Worker };
136*635a8641SAndroid Build Coastguard Worker
137*635a8641SAndroid Build Coastguard Worker class MessageCountFilter : public IPC::MessageFilter {
138*635a8641SAndroid Build Coastguard Worker public:
139*635a8641SAndroid Build Coastguard Worker enum FilterEvent {
140*635a8641SAndroid Build Coastguard Worker NONE,
141*635a8641SAndroid Build Coastguard Worker FILTER_ADDED,
142*635a8641SAndroid Build Coastguard Worker CHANNEL_CONNECTED,
143*635a8641SAndroid Build Coastguard Worker CHANNEL_ERROR,
144*635a8641SAndroid Build Coastguard Worker CHANNEL_CLOSING,
145*635a8641SAndroid Build Coastguard Worker FILTER_REMOVED
146*635a8641SAndroid Build Coastguard Worker };
147*635a8641SAndroid Build Coastguard Worker
148*635a8641SAndroid Build Coastguard Worker MessageCountFilter() = default;
MessageCountFilter(uint32_t supported_message_class)149*635a8641SAndroid Build Coastguard Worker MessageCountFilter(uint32_t supported_message_class)
150*635a8641SAndroid Build Coastguard Worker : supported_message_class_(supported_message_class),
151*635a8641SAndroid Build Coastguard Worker is_global_filter_(false) {}
152*635a8641SAndroid Build Coastguard Worker
OnFilterAdded(IPC::Channel * channel)153*635a8641SAndroid Build Coastguard Worker void OnFilterAdded(IPC::Channel* channel) override {
154*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(channel);
155*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(NONE, last_filter_event_);
156*635a8641SAndroid Build Coastguard Worker last_filter_event_ = FILTER_ADDED;
157*635a8641SAndroid Build Coastguard Worker }
158*635a8641SAndroid Build Coastguard Worker
OnChannelConnected(int32_t peer_pid)159*635a8641SAndroid Build Coastguard Worker void OnChannelConnected(int32_t peer_pid) override {
160*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(FILTER_ADDED, last_filter_event_);
161*635a8641SAndroid Build Coastguard Worker EXPECT_NE(static_cast<int32_t>(base::kNullProcessId), peer_pid);
162*635a8641SAndroid Build Coastguard Worker last_filter_event_ = CHANNEL_CONNECTED;
163*635a8641SAndroid Build Coastguard Worker }
164*635a8641SAndroid Build Coastguard Worker
OnChannelError()165*635a8641SAndroid Build Coastguard Worker void OnChannelError() override {
166*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
167*635a8641SAndroid Build Coastguard Worker last_filter_event_ = CHANNEL_ERROR;
168*635a8641SAndroid Build Coastguard Worker }
169*635a8641SAndroid Build Coastguard Worker
OnChannelClosing()170*635a8641SAndroid Build Coastguard Worker void OnChannelClosing() override {
171*635a8641SAndroid Build Coastguard Worker // We may or may not have gotten OnChannelError; if not, the last event has
172*635a8641SAndroid Build Coastguard Worker // to be OnChannelConnected.
173*635a8641SAndroid Build Coastguard Worker EXPECT_NE(FILTER_REMOVED, last_filter_event_);
174*635a8641SAndroid Build Coastguard Worker if (last_filter_event_ != CHANNEL_ERROR)
175*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
176*635a8641SAndroid Build Coastguard Worker last_filter_event_ = CHANNEL_CLOSING;
177*635a8641SAndroid Build Coastguard Worker }
178*635a8641SAndroid Build Coastguard Worker
OnFilterRemoved()179*635a8641SAndroid Build Coastguard Worker void OnFilterRemoved() override {
180*635a8641SAndroid Build Coastguard Worker // A filter may be removed at any time, even before the channel is connected
181*635a8641SAndroid Build Coastguard Worker // (and thus before OnFilterAdded is ever able to dispatch.) The only time
182*635a8641SAndroid Build Coastguard Worker // we won't see OnFilterRemoved is immediately after OnFilterAdded, because
183*635a8641SAndroid Build Coastguard Worker // OnChannelConnected is always the next event to fire after that.
184*635a8641SAndroid Build Coastguard Worker EXPECT_NE(FILTER_ADDED, last_filter_event_);
185*635a8641SAndroid Build Coastguard Worker last_filter_event_ = FILTER_REMOVED;
186*635a8641SAndroid Build Coastguard Worker }
187*635a8641SAndroid Build Coastguard Worker
OnMessageReceived(const IPC::Message & message)188*635a8641SAndroid Build Coastguard Worker bool OnMessageReceived(const IPC::Message& message) override {
189*635a8641SAndroid Build Coastguard Worker // We should always get the OnFilterAdded and OnChannelConnected events
190*635a8641SAndroid Build Coastguard Worker // prior to any messages.
191*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
192*635a8641SAndroid Build Coastguard Worker
193*635a8641SAndroid Build Coastguard Worker if (!is_global_filter_) {
194*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(supported_message_class_, IPC_MESSAGE_CLASS(message));
195*635a8641SAndroid Build Coastguard Worker }
196*635a8641SAndroid Build Coastguard Worker ++messages_received_;
197*635a8641SAndroid Build Coastguard Worker
198*635a8641SAndroid Build Coastguard Worker if (!message_filtering_enabled_)
199*635a8641SAndroid Build Coastguard Worker return false;
200*635a8641SAndroid Build Coastguard Worker
201*635a8641SAndroid Build Coastguard Worker bool handled = true;
202*635a8641SAndroid Build Coastguard Worker IPC_BEGIN_MESSAGE_MAP(MessageCountFilter, message)
203*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage)
204*635a8641SAndroid Build Coastguard Worker IPC_MESSAGE_UNHANDLED(handled = false)
205*635a8641SAndroid Build Coastguard Worker IPC_END_MESSAGE_MAP()
206*635a8641SAndroid Build Coastguard Worker return handled;
207*635a8641SAndroid Build Coastguard Worker }
208*635a8641SAndroid Build Coastguard Worker
OnBadMessage(const BadType & bad_type)209*635a8641SAndroid Build Coastguard Worker void OnBadMessage(const BadType& bad_type) {
210*635a8641SAndroid Build Coastguard Worker // Should never be called since IPC wouldn't be deserialized correctly.
211*635a8641SAndroid Build Coastguard Worker CHECK(false);
212*635a8641SAndroid Build Coastguard Worker }
213*635a8641SAndroid Build Coastguard Worker
GetSupportedMessageClasses(std::vector<uint32_t> * supported_message_classes) const214*635a8641SAndroid Build Coastguard Worker bool GetSupportedMessageClasses(
215*635a8641SAndroid Build Coastguard Worker std::vector<uint32_t>* supported_message_classes) const override {
216*635a8641SAndroid Build Coastguard Worker if (is_global_filter_)
217*635a8641SAndroid Build Coastguard Worker return false;
218*635a8641SAndroid Build Coastguard Worker supported_message_classes->push_back(supported_message_class_);
219*635a8641SAndroid Build Coastguard Worker return true;
220*635a8641SAndroid Build Coastguard Worker }
221*635a8641SAndroid Build Coastguard Worker
set_message_filtering_enabled(bool enabled)222*635a8641SAndroid Build Coastguard Worker void set_message_filtering_enabled(bool enabled) {
223*635a8641SAndroid Build Coastguard Worker message_filtering_enabled_ = enabled;
224*635a8641SAndroid Build Coastguard Worker }
225*635a8641SAndroid Build Coastguard Worker
messages_received() const226*635a8641SAndroid Build Coastguard Worker size_t messages_received() const { return messages_received_; }
last_filter_event() const227*635a8641SAndroid Build Coastguard Worker FilterEvent last_filter_event() const { return last_filter_event_; }
228*635a8641SAndroid Build Coastguard Worker
229*635a8641SAndroid Build Coastguard Worker private:
230*635a8641SAndroid Build Coastguard Worker ~MessageCountFilter() override = default;
231*635a8641SAndroid Build Coastguard Worker
232*635a8641SAndroid Build Coastguard Worker size_t messages_received_ = 0;
233*635a8641SAndroid Build Coastguard Worker uint32_t supported_message_class_ = 0;
234*635a8641SAndroid Build Coastguard Worker bool is_global_filter_ = true;
235*635a8641SAndroid Build Coastguard Worker
236*635a8641SAndroid Build Coastguard Worker FilterEvent last_filter_event_ = NONE;
237*635a8641SAndroid Build Coastguard Worker bool message_filtering_enabled_ = false;
238*635a8641SAndroid Build Coastguard Worker };
239*635a8641SAndroid Build Coastguard Worker
240*635a8641SAndroid Build Coastguard Worker class IPCChannelProxyTest : public IPCChannelMojoTestBase {
241*635a8641SAndroid Build Coastguard Worker public:
242*635a8641SAndroid Build Coastguard Worker IPCChannelProxyTest() = default;
243*635a8641SAndroid Build Coastguard Worker ~IPCChannelProxyTest() override = default;
244*635a8641SAndroid Build Coastguard Worker
SetUp()245*635a8641SAndroid Build Coastguard Worker void SetUp() override {
246*635a8641SAndroid Build Coastguard Worker IPCChannelMojoTestBase::SetUp();
247*635a8641SAndroid Build Coastguard Worker
248*635a8641SAndroid Build Coastguard Worker Init("ChannelProxyClient");
249*635a8641SAndroid Build Coastguard Worker
250*635a8641SAndroid Build Coastguard Worker thread_.reset(new base::Thread("ChannelProxyTestServerThread"));
251*635a8641SAndroid Build Coastguard Worker base::Thread::Options options;
252*635a8641SAndroid Build Coastguard Worker options.message_loop_type = base::MessageLoop::TYPE_IO;
253*635a8641SAndroid Build Coastguard Worker thread_->StartWithOptions(options);
254*635a8641SAndroid Build Coastguard Worker
255*635a8641SAndroid Build Coastguard Worker listener_.reset(new QuitListener());
256*635a8641SAndroid Build Coastguard Worker channel_proxy_ = IPC::ChannelProxy::Create(
257*635a8641SAndroid Build Coastguard Worker TakeHandle().release(), IPC::Channel::MODE_SERVER, listener_.get(),
258*635a8641SAndroid Build Coastguard Worker thread_->task_runner(), base::ThreadTaskRunnerHandle::Get());
259*635a8641SAndroid Build Coastguard Worker }
260*635a8641SAndroid Build Coastguard Worker
TearDown()261*635a8641SAndroid Build Coastguard Worker void TearDown() override {
262*635a8641SAndroid Build Coastguard Worker channel_proxy_.reset();
263*635a8641SAndroid Build Coastguard Worker thread_.reset();
264*635a8641SAndroid Build Coastguard Worker listener_.reset();
265*635a8641SAndroid Build Coastguard Worker IPCChannelMojoTestBase::TearDown();
266*635a8641SAndroid Build Coastguard Worker }
267*635a8641SAndroid Build Coastguard Worker
SendQuitMessageAndWaitForIdle()268*635a8641SAndroid Build Coastguard Worker void SendQuitMessageAndWaitForIdle() {
269*635a8641SAndroid Build Coastguard Worker sender()->Send(new WorkerMsg_Quit);
270*635a8641SAndroid Build Coastguard Worker CreateRunLoopAndRun(&listener_->run_loop_);
271*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(WaitForClientShutdown());
272*635a8641SAndroid Build Coastguard Worker }
273*635a8641SAndroid Build Coastguard Worker
DidListenerGetBadMessage()274*635a8641SAndroid Build Coastguard Worker bool DidListenerGetBadMessage() {
275*635a8641SAndroid Build Coastguard Worker return listener_->bad_message_received_;
276*635a8641SAndroid Build Coastguard Worker }
277*635a8641SAndroid Build Coastguard Worker
channel_proxy()278*635a8641SAndroid Build Coastguard Worker IPC::ChannelProxy* channel_proxy() { return channel_proxy_.get(); }
sender()279*635a8641SAndroid Build Coastguard Worker IPC::Sender* sender() { return channel_proxy_.get(); }
280*635a8641SAndroid Build Coastguard Worker
281*635a8641SAndroid Build Coastguard Worker private:
282*635a8641SAndroid Build Coastguard Worker std::unique_ptr<base::Thread> thread_;
283*635a8641SAndroid Build Coastguard Worker std::unique_ptr<QuitListener> listener_;
284*635a8641SAndroid Build Coastguard Worker std::unique_ptr<IPC::ChannelProxy> channel_proxy_;
285*635a8641SAndroid Build Coastguard Worker };
286*635a8641SAndroid Build Coastguard Worker
TEST_F(IPCChannelProxyTest,MessageClassFilters)287*635a8641SAndroid Build Coastguard Worker TEST_F(IPCChannelProxyTest, MessageClassFilters) {
288*635a8641SAndroid Build Coastguard Worker // Construct a filter per message class.
289*635a8641SAndroid Build Coastguard Worker std::vector<scoped_refptr<MessageCountFilter>> class_filters;
290*635a8641SAndroid Build Coastguard Worker class_filters.push_back(
291*635a8641SAndroid Build Coastguard Worker base::MakeRefCounted<MessageCountFilter>(TestMsgStart));
292*635a8641SAndroid Build Coastguard Worker class_filters.push_back(
293*635a8641SAndroid Build Coastguard Worker base::MakeRefCounted<MessageCountFilter>(AutomationMsgStart));
294*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < class_filters.size(); ++i)
295*635a8641SAndroid Build Coastguard Worker channel_proxy()->AddFilter(class_filters[i].get());
296*635a8641SAndroid Build Coastguard Worker
297*635a8641SAndroid Build Coastguard Worker // Send a message for each class; each filter should receive just one message.
298*635a8641SAndroid Build Coastguard Worker sender()->Send(new TestMsg_Bounce);
299*635a8641SAndroid Build Coastguard Worker sender()->Send(new AutomationMsg_Bounce);
300*635a8641SAndroid Build Coastguard Worker
301*635a8641SAndroid Build Coastguard Worker // Send some messages not assigned to a specific or valid message class.
302*635a8641SAndroid Build Coastguard Worker sender()->Send(new WorkerMsg_Bounce);
303*635a8641SAndroid Build Coastguard Worker
304*635a8641SAndroid Build Coastguard Worker // Each filter should have received just the one sent message of the
305*635a8641SAndroid Build Coastguard Worker // corresponding class.
306*635a8641SAndroid Build Coastguard Worker SendQuitMessageAndWaitForIdle();
307*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < class_filters.size(); ++i)
308*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1U, class_filters[i]->messages_received());
309*635a8641SAndroid Build Coastguard Worker }
310*635a8641SAndroid Build Coastguard Worker
TEST_F(IPCChannelProxyTest,GlobalAndMessageClassFilters)311*635a8641SAndroid Build Coastguard Worker TEST_F(IPCChannelProxyTest, GlobalAndMessageClassFilters) {
312*635a8641SAndroid Build Coastguard Worker // Add a class and global filter.
313*635a8641SAndroid Build Coastguard Worker scoped_refptr<MessageCountFilter> class_filter(
314*635a8641SAndroid Build Coastguard Worker new MessageCountFilter(TestMsgStart));
315*635a8641SAndroid Build Coastguard Worker class_filter->set_message_filtering_enabled(false);
316*635a8641SAndroid Build Coastguard Worker channel_proxy()->AddFilter(class_filter.get());
317*635a8641SAndroid Build Coastguard Worker
318*635a8641SAndroid Build Coastguard Worker scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter());
319*635a8641SAndroid Build Coastguard Worker global_filter->set_message_filtering_enabled(false);
320*635a8641SAndroid Build Coastguard Worker channel_proxy()->AddFilter(global_filter.get());
321*635a8641SAndroid Build Coastguard Worker
322*635a8641SAndroid Build Coastguard Worker // A message of class Test should be seen by both the global filter and
323*635a8641SAndroid Build Coastguard Worker // Test-specific filter.
324*635a8641SAndroid Build Coastguard Worker sender()->Send(new TestMsg_Bounce);
325*635a8641SAndroid Build Coastguard Worker
326*635a8641SAndroid Build Coastguard Worker // A message of a different class should be seen only by the global filter.
327*635a8641SAndroid Build Coastguard Worker sender()->Send(new AutomationMsg_Bounce);
328*635a8641SAndroid Build Coastguard Worker
329*635a8641SAndroid Build Coastguard Worker // Flush all messages.
330*635a8641SAndroid Build Coastguard Worker SendQuitMessageAndWaitForIdle();
331*635a8641SAndroid Build Coastguard Worker
332*635a8641SAndroid Build Coastguard Worker // The class filter should have received only the class-specific message.
333*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1U, class_filter->messages_received());
334*635a8641SAndroid Build Coastguard Worker
335*635a8641SAndroid Build Coastguard Worker // The global filter should have received both messages, as well as the final
336*635a8641SAndroid Build Coastguard Worker // QUIT message.
337*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3U, global_filter->messages_received());
338*635a8641SAndroid Build Coastguard Worker }
339*635a8641SAndroid Build Coastguard Worker
TEST_F(IPCChannelProxyTest,FilterRemoval)340*635a8641SAndroid Build Coastguard Worker TEST_F(IPCChannelProxyTest, FilterRemoval) {
341*635a8641SAndroid Build Coastguard Worker // Add a class and global filter.
342*635a8641SAndroid Build Coastguard Worker scoped_refptr<MessageCountFilter> class_filter(
343*635a8641SAndroid Build Coastguard Worker new MessageCountFilter(TestMsgStart));
344*635a8641SAndroid Build Coastguard Worker scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter());
345*635a8641SAndroid Build Coastguard Worker
346*635a8641SAndroid Build Coastguard Worker // Add and remove both types of filters.
347*635a8641SAndroid Build Coastguard Worker channel_proxy()->AddFilter(class_filter.get());
348*635a8641SAndroid Build Coastguard Worker channel_proxy()->AddFilter(global_filter.get());
349*635a8641SAndroid Build Coastguard Worker channel_proxy()->RemoveFilter(global_filter.get());
350*635a8641SAndroid Build Coastguard Worker channel_proxy()->RemoveFilter(class_filter.get());
351*635a8641SAndroid Build Coastguard Worker
352*635a8641SAndroid Build Coastguard Worker // Send some messages; they should not be seen by either filter.
353*635a8641SAndroid Build Coastguard Worker sender()->Send(new TestMsg_Bounce);
354*635a8641SAndroid Build Coastguard Worker sender()->Send(new AutomationMsg_Bounce);
355*635a8641SAndroid Build Coastguard Worker
356*635a8641SAndroid Build Coastguard Worker // Ensure that the filters were removed and did not receive any messages.
357*635a8641SAndroid Build Coastguard Worker SendQuitMessageAndWaitForIdle();
358*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(MessageCountFilter::FILTER_REMOVED,
359*635a8641SAndroid Build Coastguard Worker global_filter->last_filter_event());
360*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(MessageCountFilter::FILTER_REMOVED,
361*635a8641SAndroid Build Coastguard Worker class_filter->last_filter_event());
362*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0U, class_filter->messages_received());
363*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0U, global_filter->messages_received());
364*635a8641SAndroid Build Coastguard Worker }
365*635a8641SAndroid Build Coastguard Worker
TEST_F(IPCChannelProxyTest,BadMessageOnListenerThread)366*635a8641SAndroid Build Coastguard Worker TEST_F(IPCChannelProxyTest, BadMessageOnListenerThread) {
367*635a8641SAndroid Build Coastguard Worker scoped_refptr<MessageCountFilter> class_filter(
368*635a8641SAndroid Build Coastguard Worker new MessageCountFilter(TestMsgStart));
369*635a8641SAndroid Build Coastguard Worker class_filter->set_message_filtering_enabled(false);
370*635a8641SAndroid Build Coastguard Worker channel_proxy()->AddFilter(class_filter.get());
371*635a8641SAndroid Build Coastguard Worker
372*635a8641SAndroid Build Coastguard Worker sender()->Send(new TestMsg_SendBadMessage());
373*635a8641SAndroid Build Coastguard Worker
374*635a8641SAndroid Build Coastguard Worker SendQuitMessageAndWaitForIdle();
375*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(DidListenerGetBadMessage());
376*635a8641SAndroid Build Coastguard Worker }
377*635a8641SAndroid Build Coastguard Worker
TEST_F(IPCChannelProxyTest,BadMessageOnIPCThread)378*635a8641SAndroid Build Coastguard Worker TEST_F(IPCChannelProxyTest, BadMessageOnIPCThread) {
379*635a8641SAndroid Build Coastguard Worker scoped_refptr<MessageCountFilter> class_filter(
380*635a8641SAndroid Build Coastguard Worker new MessageCountFilter(TestMsgStart));
381*635a8641SAndroid Build Coastguard Worker class_filter->set_message_filtering_enabled(true);
382*635a8641SAndroid Build Coastguard Worker channel_proxy()->AddFilter(class_filter.get());
383*635a8641SAndroid Build Coastguard Worker
384*635a8641SAndroid Build Coastguard Worker sender()->Send(new TestMsg_SendBadMessage());
385*635a8641SAndroid Build Coastguard Worker
386*635a8641SAndroid Build Coastguard Worker SendQuitMessageAndWaitForIdle();
387*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(DidListenerGetBadMessage());
388*635a8641SAndroid Build Coastguard Worker }
389*635a8641SAndroid Build Coastguard Worker
390*635a8641SAndroid Build Coastguard Worker class IPCChannelBadMessageTest : public IPCChannelMojoTestBase {
391*635a8641SAndroid Build Coastguard Worker public:
SetUp()392*635a8641SAndroid Build Coastguard Worker void SetUp() override {
393*635a8641SAndroid Build Coastguard Worker IPCChannelMojoTestBase::SetUp();
394*635a8641SAndroid Build Coastguard Worker
395*635a8641SAndroid Build Coastguard Worker Init("ChannelProxyClient");
396*635a8641SAndroid Build Coastguard Worker
397*635a8641SAndroid Build Coastguard Worker listener_.reset(new QuitListener());
398*635a8641SAndroid Build Coastguard Worker CreateChannel(listener_.get());
399*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(ConnectChannel());
400*635a8641SAndroid Build Coastguard Worker }
401*635a8641SAndroid Build Coastguard Worker
TearDown()402*635a8641SAndroid Build Coastguard Worker void TearDown() override {
403*635a8641SAndroid Build Coastguard Worker IPCChannelMojoTestBase::TearDown();
404*635a8641SAndroid Build Coastguard Worker listener_.reset();
405*635a8641SAndroid Build Coastguard Worker }
406*635a8641SAndroid Build Coastguard Worker
SendQuitMessageAndWaitForIdle()407*635a8641SAndroid Build Coastguard Worker void SendQuitMessageAndWaitForIdle() {
408*635a8641SAndroid Build Coastguard Worker sender()->Send(new WorkerMsg_Quit);
409*635a8641SAndroid Build Coastguard Worker CreateRunLoopAndRun(&listener_->run_loop_);
410*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(WaitForClientShutdown());
411*635a8641SAndroid Build Coastguard Worker }
412*635a8641SAndroid Build Coastguard Worker
DidListenerGetBadMessage()413*635a8641SAndroid Build Coastguard Worker bool DidListenerGetBadMessage() {
414*635a8641SAndroid Build Coastguard Worker return listener_->bad_message_received_;
415*635a8641SAndroid Build Coastguard Worker }
416*635a8641SAndroid Build Coastguard Worker
417*635a8641SAndroid Build Coastguard Worker private:
418*635a8641SAndroid Build Coastguard Worker std::unique_ptr<QuitListener> listener_;
419*635a8641SAndroid Build Coastguard Worker };
420*635a8641SAndroid Build Coastguard Worker
TEST_F(IPCChannelBadMessageTest,BadMessage)421*635a8641SAndroid Build Coastguard Worker TEST_F(IPCChannelBadMessageTest, BadMessage) {
422*635a8641SAndroid Build Coastguard Worker sender()->Send(new TestMsg_SendBadMessage());
423*635a8641SAndroid Build Coastguard Worker SendQuitMessageAndWaitForIdle();
424*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(DidListenerGetBadMessage());
425*635a8641SAndroid Build Coastguard Worker }
426*635a8641SAndroid Build Coastguard Worker
DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ChannelProxyClient)427*635a8641SAndroid Build Coastguard Worker DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ChannelProxyClient) {
428*635a8641SAndroid Build Coastguard Worker ChannelReflectorListener listener;
429*635a8641SAndroid Build Coastguard Worker Connect(&listener);
430*635a8641SAndroid Build Coastguard Worker listener.Init(channel());
431*635a8641SAndroid Build Coastguard Worker
432*635a8641SAndroid Build Coastguard Worker CreateRunLoopAndRun(&listener.run_loop_);
433*635a8641SAndroid Build Coastguard Worker
434*635a8641SAndroid Build Coastguard Worker Close();
435*635a8641SAndroid Build Coastguard Worker }
436*635a8641SAndroid Build Coastguard Worker
437*635a8641SAndroid Build Coastguard Worker } // namespace
438