1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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 "ipc/ipc_message.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker #include <string.h>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include <limits>
12*6777b538SAndroid Build Coastguard Worker #include <memory>
13*6777b538SAndroid Build Coastguard Worker #include <utility>
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
18*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
19*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_utils.h"
20*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker // IPC messages for testing ----------------------------------------------------
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_IMPL
25*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_macros.h"
26*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_start.h"
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker #define IPC_MESSAGE_START TestMsgStart
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_CONTROL0(TestMsgClassEmpty)
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_CONTROL1(TestMsgClassI, int)
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker IPC_SYNC_MESSAGE_CONTROL1_1(TestMsgClassIS, int, std::string)
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker namespace IPC {
37*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageTest,BasicMessageTest)38*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageTest, BasicMessageTest) {
39*6777b538SAndroid Build Coastguard Worker int v1 = 10;
40*6777b538SAndroid Build Coastguard Worker std::string v2("foobar");
41*6777b538SAndroid Build Coastguard Worker std::u16string v3(u"hello world");
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker IPC::Message m(0, 1, IPC::Message::PRIORITY_NORMAL);
44*6777b538SAndroid Build Coastguard Worker m.WriteInt(v1);
45*6777b538SAndroid Build Coastguard Worker m.WriteString(v2);
46*6777b538SAndroid Build Coastguard Worker m.WriteString16(v3);
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(m);
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker int vi;
51*6777b538SAndroid Build Coastguard Worker std::string vs;
52*6777b538SAndroid Build Coastguard Worker std::u16string vs16;
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(iter.ReadInt(&vi));
55*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(v1, vi);
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(iter.ReadString(&vs));
58*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(v2, vs);
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(iter.ReadString16(&vs16));
61*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(v3, vs16);
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker // should fail
64*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(iter.ReadInt(&vi));
65*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(iter.ReadString(&vs));
66*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(iter.ReadString16(&vs16));
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageTest,Value)69*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageTest, Value) {
70*6777b538SAndroid Build Coastguard Worker auto expect_value_equals = [](const base::Value& input) {
71*6777b538SAndroid Build Coastguard Worker IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
72*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&msg, input);
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker base::Value output;
75*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(msg);
76*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&msg, &iter, &output)) << input;
77*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(input, output);
78*6777b538SAndroid Build Coastguard Worker };
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker expect_value_equals(base::Value("foo"));
81*6777b538SAndroid Build Coastguard Worker expect_value_equals(base::Value(42));
82*6777b538SAndroid Build Coastguard Worker expect_value_equals(base::Value(0.07));
83*6777b538SAndroid Build Coastguard Worker expect_value_equals(base::Value(true));
84*6777b538SAndroid Build Coastguard Worker expect_value_equals(base::Value(base::Value::BlobStorage({'a', 'b', 'c'})));
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker {
87*6777b538SAndroid Build Coastguard Worker base::Value::Dict dict;
88*6777b538SAndroid Build Coastguard Worker dict.Set("key1", 42);
89*6777b538SAndroid Build Coastguard Worker dict.Set("key2", "hi");
90*6777b538SAndroid Build Coastguard Worker expect_value_equals(base::Value(std::move(dict)));
91*6777b538SAndroid Build Coastguard Worker }
92*6777b538SAndroid Build Coastguard Worker {
93*6777b538SAndroid Build Coastguard Worker base::Value::List list;
94*6777b538SAndroid Build Coastguard Worker list.Append(42);
95*6777b538SAndroid Build Coastguard Worker list.Append("hello");
96*6777b538SAndroid Build Coastguard Worker expect_value_equals(base::Value(std::move(list)));
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker // Also test the corrupt case.
100*6777b538SAndroid Build Coastguard Worker IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL);
101*6777b538SAndroid Build Coastguard Worker bad_msg.WriteInt(99);
102*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(bad_msg);
103*6777b538SAndroid Build Coastguard Worker base::Value output;
104*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IPC::ReadParam(&bad_msg, &iter, &output));
105*6777b538SAndroid Build Coastguard Worker }
106*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageTest,ValueDict)107*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageTest, ValueDict) {
108*6777b538SAndroid Build Coastguard Worker base::Value::Dict input;
109*6777b538SAndroid Build Coastguard Worker input.Set("null", base::Value());
110*6777b538SAndroid Build Coastguard Worker input.Set("bool", true);
111*6777b538SAndroid Build Coastguard Worker input.Set("int", 42);
112*6777b538SAndroid Build Coastguard Worker input.Set("int.with.dot", 43);
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker base::Value::Dict subdict;
115*6777b538SAndroid Build Coastguard Worker subdict.Set("str", "forty two");
116*6777b538SAndroid Build Coastguard Worker subdict.Set("bool", false);
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker base::Value::List sublist;
119*6777b538SAndroid Build Coastguard Worker sublist.Append(42.42);
120*6777b538SAndroid Build Coastguard Worker sublist.Append("forty");
121*6777b538SAndroid Build Coastguard Worker sublist.Append("two");
122*6777b538SAndroid Build Coastguard Worker subdict.Set("list", std::move(sublist));
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker input.Set("dict", std::move(subdict));
125*6777b538SAndroid Build Coastguard Worker
126*6777b538SAndroid Build Coastguard Worker IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
127*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&msg, input);
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker base::Value::Dict output;
130*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(msg);
131*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&msg, &iter, &output));
132*6777b538SAndroid Build Coastguard Worker
133*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(input, output);
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker // Also test the corrupt case.
136*6777b538SAndroid Build Coastguard Worker IPC::Message bad_msg(1, 2, IPC::Message::PRIORITY_NORMAL);
137*6777b538SAndroid Build Coastguard Worker bad_msg.WriteInt(99);
138*6777b538SAndroid Build Coastguard Worker iter = base::PickleIterator(bad_msg);
139*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IPC::ReadParam(&bad_msg, &iter, &output));
140*6777b538SAndroid Build Coastguard Worker }
141*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageTest,FindNext)142*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageTest, FindNext) {
143*6777b538SAndroid Build Coastguard Worker IPC::Message message;
144*6777b538SAndroid Build Coastguard Worker message.WriteString("Goooooooogle");
145*6777b538SAndroid Build Coastguard Worker message.WriteInt(111);
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker std::vector<char> message_data(message.size() + 7);
148*6777b538SAndroid Build Coastguard Worker memcpy(message_data.data(), message.data(), message.size());
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Worker const char* data_start = message_data.data();
151*6777b538SAndroid Build Coastguard Worker const char* data_end = data_start + message.size();
152*6777b538SAndroid Build Coastguard Worker
153*6777b538SAndroid Build Coastguard Worker IPC::Message::NextMessageInfo next;
154*6777b538SAndroid Build Coastguard Worker
155*6777b538SAndroid Build Coastguard Worker // Data range contains the entire message plus some extra bytes
156*6777b538SAndroid Build Coastguard Worker IPC::Message::FindNext(data_start, data_end + 1, &next);
157*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(next.message_found);
158*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_size, message.size());
159*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.pickle_end, data_end);
160*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_end, data_end);
161*6777b538SAndroid Build Coastguard Worker
162*6777b538SAndroid Build Coastguard Worker // Data range exactly contains the entire message
163*6777b538SAndroid Build Coastguard Worker IPC::Message::FindNext(data_start, data_end, &next);
164*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(next.message_found);
165*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_size, message.size());
166*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.pickle_end, data_end);
167*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_end, data_end);
168*6777b538SAndroid Build Coastguard Worker
169*6777b538SAndroid Build Coastguard Worker // Data range doesn't contain the entire message
170*6777b538SAndroid Build Coastguard Worker // (but contains the message header)
171*6777b538SAndroid Build Coastguard Worker IPC::Message::FindNext(data_start, data_end - 1, &next);
172*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(next.message_found);
173*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_size, message.size());
174*6777b538SAndroid Build Coastguard Worker
175*6777b538SAndroid Build Coastguard Worker // Data range doesn't contain the message header
176*6777b538SAndroid Build Coastguard Worker // (but contains the pickle header)
177*6777b538SAndroid Build Coastguard Worker IPC::Message::FindNext(data_start,
178*6777b538SAndroid Build Coastguard Worker data_start + sizeof(IPC::Message::Header) - 1,
179*6777b538SAndroid Build Coastguard Worker &next);
180*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(next.message_found);
181*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_size, 0u);
182*6777b538SAndroid Build Coastguard Worker
183*6777b538SAndroid Build Coastguard Worker // Data range doesn't contain the pickle header
184*6777b538SAndroid Build Coastguard Worker IPC::Message::FindNext(data_start,
185*6777b538SAndroid Build Coastguard Worker data_start + sizeof(base::Pickle::Header) - 1,
186*6777b538SAndroid Build Coastguard Worker &next);
187*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(next.message_found);
188*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_size, 0u);
189*6777b538SAndroid Build Coastguard Worker }
190*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageTest,FindNextOverflow)191*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageTest, FindNextOverflow) {
192*6777b538SAndroid Build Coastguard Worker IPC::Message message;
193*6777b538SAndroid Build Coastguard Worker message.WriteString("Data");
194*6777b538SAndroid Build Coastguard Worker message.WriteInt(777);
195*6777b538SAndroid Build Coastguard Worker
196*6777b538SAndroid Build Coastguard Worker const char* data_start = reinterpret_cast<const char*>(message.data());
197*6777b538SAndroid Build Coastguard Worker const char* data_end = data_start + message.size();
198*6777b538SAndroid Build Coastguard Worker
199*6777b538SAndroid Build Coastguard Worker IPC::Message::NextMessageInfo next;
200*6777b538SAndroid Build Coastguard Worker
201*6777b538SAndroid Build Coastguard Worker // Payload size is negative (defeats 'start + size > end' check)
202*6777b538SAndroid Build Coastguard Worker message.header()->payload_size = static_cast<uint32_t>(-1);
203*6777b538SAndroid Build Coastguard Worker IPC::Message::FindNext(data_start, data_end, &next);
204*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(next.message_found);
205*6777b538SAndroid Build Coastguard Worker if (sizeof(size_t) > sizeof(uint32_t)) {
206*6777b538SAndroid Build Coastguard Worker // No overflow, just insane message size
207*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_size,
208*6777b538SAndroid Build Coastguard Worker message.header()->payload_size + sizeof(IPC::Message::Header));
209*6777b538SAndroid Build Coastguard Worker } else {
210*6777b538SAndroid Build Coastguard Worker // Actual overflow, reported as max size_t
211*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_size, std::numeric_limits<size_t>::max());
212*6777b538SAndroid Build Coastguard Worker }
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard Worker // Payload size is max positive integer (defeats size < 0 check, while
215*6777b538SAndroid Build Coastguard Worker // still potentially causing overflow down the road).
216*6777b538SAndroid Build Coastguard Worker message.header()->payload_size = std::numeric_limits<int32_t>::max();
217*6777b538SAndroid Build Coastguard Worker IPC::Message::FindNext(data_start, data_end, &next);
218*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(next.message_found);
219*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(next.message_size,
220*6777b538SAndroid Build Coastguard Worker message.header()->payload_size + sizeof(IPC::Message::Header));
221*6777b538SAndroid Build Coastguard Worker }
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Worker namespace {
224*6777b538SAndroid Build Coastguard Worker
225*6777b538SAndroid Build Coastguard Worker class IPCMessageParameterTest : public testing::Test {
226*6777b538SAndroid Build Coastguard Worker public:
IPCMessageParameterTest()227*6777b538SAndroid Build Coastguard Worker IPCMessageParameterTest() : extra_param_("extra_param"), called_(false) {}
228*6777b538SAndroid Build Coastguard Worker
OnMessageReceived(const IPC::Message & message)229*6777b538SAndroid Build Coastguard Worker bool OnMessageReceived(const IPC::Message& message) {
230*6777b538SAndroid Build Coastguard Worker bool handled = true;
231*6777b538SAndroid Build Coastguard Worker IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(IPCMessageParameterTest, message,
232*6777b538SAndroid Build Coastguard Worker &extra_param_)
233*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(TestMsgClassEmpty, OnEmpty)
234*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_HANDLER(TestMsgClassI, OnInt)
235*6777b538SAndroid Build Coastguard Worker //IPC_MESSAGE_HANDLER(TestMsgClassIS, OnSync)
236*6777b538SAndroid Build Coastguard Worker IPC_MESSAGE_UNHANDLED(handled = false)
237*6777b538SAndroid Build Coastguard Worker IPC_END_MESSAGE_MAP()
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker return handled;
240*6777b538SAndroid Build Coastguard Worker }
241*6777b538SAndroid Build Coastguard Worker
OnEmpty(std::string * extra_param)242*6777b538SAndroid Build Coastguard Worker void OnEmpty(std::string* extra_param) {
243*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(extra_param, &extra_param_);
244*6777b538SAndroid Build Coastguard Worker called_ = true;
245*6777b538SAndroid Build Coastguard Worker }
246*6777b538SAndroid Build Coastguard Worker
OnInt(std::string * extra_param,int foo)247*6777b538SAndroid Build Coastguard Worker void OnInt(std::string* extra_param, int foo) {
248*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(extra_param, &extra_param_);
249*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(foo, 42);
250*6777b538SAndroid Build Coastguard Worker called_ = true;
251*6777b538SAndroid Build Coastguard Worker }
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker /* TODO: handle sync IPCs
254*6777b538SAndroid Build Coastguard Worker void OnSync(std::string* extra_param, int foo, std::string* out) {
255*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(extra_param, &extra_param_);
256*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(foo, 42);
257*6777b538SAndroid Build Coastguard Worker called_ = true;
258*6777b538SAndroid Build Coastguard Worker *out = std::string("out");
259*6777b538SAndroid Build Coastguard Worker }
260*6777b538SAndroid Build Coastguard Worker
261*6777b538SAndroid Build Coastguard Worker bool Send(IPC::Message* reply) {
262*6777b538SAndroid Build Coastguard Worker delete reply;
263*6777b538SAndroid Build Coastguard Worker return true;
264*6777b538SAndroid Build Coastguard Worker }*/
265*6777b538SAndroid Build Coastguard Worker
266*6777b538SAndroid Build Coastguard Worker std::string extra_param_;
267*6777b538SAndroid Build Coastguard Worker bool called_;
268*6777b538SAndroid Build Coastguard Worker };
269*6777b538SAndroid Build Coastguard Worker
270*6777b538SAndroid Build Coastguard Worker } // namespace
271*6777b538SAndroid Build Coastguard Worker
TEST_F(IPCMessageParameterTest,EmptyDispatcherWithParam)272*6777b538SAndroid Build Coastguard Worker TEST_F(IPCMessageParameterTest, EmptyDispatcherWithParam) {
273*6777b538SAndroid Build Coastguard Worker TestMsgClassEmpty message;
274*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(OnMessageReceived(message));
275*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(called_);
276*6777b538SAndroid Build Coastguard Worker }
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
279*6777b538SAndroid Build Coastguard Worker #define MAYBE_OneIntegerWithParam DISABLED_OneIntegerWithParam
280*6777b538SAndroid Build Coastguard Worker #else
281*6777b538SAndroid Build Coastguard Worker #define MAYBE_OneIntegerWithParam OneIntegerWithParam
282*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(IPCMessageParameterTest,MAYBE_OneIntegerWithParam)283*6777b538SAndroid Build Coastguard Worker TEST_F(IPCMessageParameterTest, MAYBE_OneIntegerWithParam) {
284*6777b538SAndroid Build Coastguard Worker TestMsgClassI message(42);
285*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(OnMessageReceived(message));
286*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(called_);
287*6777b538SAndroid Build Coastguard Worker }
288*6777b538SAndroid Build Coastguard Worker
289*6777b538SAndroid Build Coastguard Worker /* TODO: handle sync IPCs
290*6777b538SAndroid Build Coastguard Worker TEST_F(IPCMessageParameterTest, Sync) {
291*6777b538SAndroid Build Coastguard Worker std::string output;
292*6777b538SAndroid Build Coastguard Worker TestMsgClassIS message(42, &output);
293*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(OnMessageReceived(message));
294*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(called_);
295*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(output, std::string("out"));
296*6777b538SAndroid Build Coastguard Worker }*/
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker } // namespace IPC
299