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