xref: /aosp_15_r20/external/cronet/ipc/ipc_channel_proxy_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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