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_utils.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 <memory>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/json/json_reader.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/test/test_shared_memory_util.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/unguessable_token.h"
16*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
17*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_channel_handle.h"
18*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message.h"
19*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
22*6777b538SAndroid Build Coastguard Worker #include <windows.h>
23*6777b538SAndroid Build Coastguard Worker #endif
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker namespace IPC {
26*6777b538SAndroid Build Coastguard Worker namespace {
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker // Tests nesting of messages as parameters to other messages.
TEST(IPCMessageUtilsTest,NestedMessages)29*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, NestedMessages) {
30*6777b538SAndroid Build Coastguard Worker int32_t nested_routing = 12;
31*6777b538SAndroid Build Coastguard Worker uint32_t nested_type = 78;
32*6777b538SAndroid Build Coastguard Worker int nested_content = 456789;
33*6777b538SAndroid Build Coastguard Worker Message::PriorityValue nested_priority = Message::PRIORITY_HIGH;
34*6777b538SAndroid Build Coastguard Worker Message nested_msg(nested_routing, nested_type, nested_priority);
35*6777b538SAndroid Build Coastguard Worker nested_msg.set_sync();
36*6777b538SAndroid Build Coastguard Worker ParamTraits<int>::Write(&nested_msg, nested_content);
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker // Outer message contains the nested one as its parameter.
39*6777b538SAndroid Build Coastguard Worker int32_t outer_routing = 91;
40*6777b538SAndroid Build Coastguard Worker uint32_t outer_type = 88;
41*6777b538SAndroid Build Coastguard Worker Message::PriorityValue outer_priority = Message::PRIORITY_NORMAL;
42*6777b538SAndroid Build Coastguard Worker Message outer_msg(outer_routing, outer_type, outer_priority);
43*6777b538SAndroid Build Coastguard Worker ParamTraits<Message>::Write(&outer_msg, nested_msg);
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker // Read back the nested message.
46*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(outer_msg);
47*6777b538SAndroid Build Coastguard Worker IPC::Message result_msg;
48*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(ParamTraits<Message>::Read(&outer_msg, &iter, &result_msg));
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker // Verify nested message headers.
51*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(nested_msg.routing_id(), result_msg.routing_id());
52*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(nested_msg.type(), result_msg.type());
53*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(nested_msg.priority(), result_msg.priority());
54*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(nested_msg.flags(), result_msg.flags());
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker // Verify nested message content
57*6777b538SAndroid Build Coastguard Worker base::PickleIterator nested_iter(nested_msg);
58*6777b538SAndroid Build Coastguard Worker int result_content = 0;
59*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(ParamTraits<int>::Read(&nested_msg, &nested_iter,
60*6777b538SAndroid Build Coastguard Worker &result_content));
61*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(nested_content, result_content);
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker // Try reading past the ends for both messages and make sure it fails.
64*6777b538SAndroid Build Coastguard Worker IPC::Message dummy;
65*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(ParamTraits<Message>::Read(&outer_msg, &iter, &dummy));
66*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(ParamTraits<int>::Read(&nested_msg, &nested_iter,
67*6777b538SAndroid Build Coastguard Worker &result_content));
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker // Tests that detection of various bad parameters is working correctly.
TEST(IPCMessageUtilsTest,ParameterValidation)71*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, ParameterValidation) {
72*6777b538SAndroid Build Coastguard Worker base::FilePath::StringType ok_string(FILE_PATH_LITERAL("hello"), 5);
73*6777b538SAndroid Build Coastguard Worker base::FilePath::StringType bad_string(FILE_PATH_LITERAL("hel\0o"), 5);
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker // Change this if ParamTraits<FilePath>::Write() changes.
76*6777b538SAndroid Build Coastguard Worker IPC::Message message;
77*6777b538SAndroid Build Coastguard Worker ParamTraits<base::FilePath::StringType>::Write(&message, ok_string);
78*6777b538SAndroid Build Coastguard Worker ParamTraits<base::FilePath::StringType>::Write(&message, bad_string);
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(message);
81*6777b538SAndroid Build Coastguard Worker base::FilePath ok_path;
82*6777b538SAndroid Build Coastguard Worker base::FilePath bad_path;
83*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(ParamTraits<base::FilePath>::Read(&message, &iter, &ok_path));
84*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(ParamTraits<base::FilePath>::Read(&message, &iter, &bad_path));
85*6777b538SAndroid Build Coastguard Worker }
86*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,InlinedVector)87*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, InlinedVector) {
88*6777b538SAndroid Build Coastguard Worker static constexpr size_t stack_capacity = 5;
89*6777b538SAndroid Build Coastguard Worker absl::InlinedVector<double, stack_capacity> inlined_vector;
90*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < 2 * stack_capacity; i++) {
91*6777b538SAndroid Build Coastguard Worker inlined_vector.push_back(i * 2.0);
92*6777b538SAndroid Build Coastguard Worker }
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
95*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&msg, inlined_vector);
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker absl::InlinedVector<double, stack_capacity> output;
98*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(msg);
99*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&msg, &iter, &output));
100*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(inlined_vector.size(), output.size());
101*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < 2 * stack_capacity; i++) {
102*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(inlined_vector[i], output[i]);
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker }
105*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,MojoChannelHandle)106*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, MojoChannelHandle) {
107*6777b538SAndroid Build Coastguard Worker mojo::MessagePipe message_pipe;
108*6777b538SAndroid Build Coastguard Worker IPC::ChannelHandle channel_handle(message_pipe.handle0.release());
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker IPC::Message message;
111*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&message, channel_handle);
112*6777b538SAndroid Build Coastguard Worker
113*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(message);
114*6777b538SAndroid Build Coastguard Worker IPC::ChannelHandle result_handle;
115*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&message, &iter, &result_handle));
116*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(channel_handle.mojo_handle, result_handle.mojo_handle);
117*6777b538SAndroid Build Coastguard Worker }
118*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,OptionalUnset)119*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, OptionalUnset) {
120*6777b538SAndroid Build Coastguard Worker std::optional<int> opt;
121*6777b538SAndroid Build Coastguard Worker base::Pickle pickle;
122*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&pickle, opt);
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker std::string log;
125*6777b538SAndroid Build Coastguard Worker IPC::LogParam(opt, &log);
126*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("(unset)", log);
127*6777b538SAndroid Build Coastguard Worker
128*6777b538SAndroid Build Coastguard Worker std::optional<int> unserialized_opt;
129*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(pickle);
130*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&pickle, &iter, &unserialized_opt));
131*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(unserialized_opt);
132*6777b538SAndroid Build Coastguard Worker }
133*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,OptionalSet)134*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, OptionalSet) {
135*6777b538SAndroid Build Coastguard Worker std::optional<int> opt(10);
136*6777b538SAndroid Build Coastguard Worker base::Pickle pickle;
137*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&pickle, opt);
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker std::string log;
140*6777b538SAndroid Build Coastguard Worker IPC::LogParam(opt, &log);
141*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("10", log);
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard Worker std::optional<int> unserialized_opt;
144*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(pickle);
145*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&pickle, &iter, &unserialized_opt));
146*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(unserialized_opt);
147*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(opt.value(), unserialized_opt.value());
148*6777b538SAndroid Build Coastguard Worker }
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Worker template <typename SharedMemoryRegionType>
151*6777b538SAndroid Build Coastguard Worker class SharedMemoryRegionTypedTest : public ::testing::Test {};
152*6777b538SAndroid Build Coastguard Worker
153*6777b538SAndroid Build Coastguard Worker typedef ::testing::Types<base::WritableSharedMemoryRegion,
154*6777b538SAndroid Build Coastguard Worker base::UnsafeSharedMemoryRegion,
155*6777b538SAndroid Build Coastguard Worker base::ReadOnlySharedMemoryRegion>
156*6777b538SAndroid Build Coastguard Worker AllSharedMemoryRegionTypes;
157*6777b538SAndroid Build Coastguard Worker TYPED_TEST_SUITE(SharedMemoryRegionTypedTest, AllSharedMemoryRegionTypes);
158*6777b538SAndroid Build Coastguard Worker
TYPED_TEST(SharedMemoryRegionTypedTest,WriteAndRead)159*6777b538SAndroid Build Coastguard Worker TYPED_TEST(SharedMemoryRegionTypedTest, WriteAndRead) {
160*6777b538SAndroid Build Coastguard Worker const size_t size = 2314;
161*6777b538SAndroid Build Coastguard Worker auto [pre_pickle, pre_mapping] = base::CreateMappedRegion<TypeParam>(size);
162*6777b538SAndroid Build Coastguard Worker const size_t pre_size = pre_pickle.GetSize();
163*6777b538SAndroid Build Coastguard Worker
164*6777b538SAndroid Build Coastguard Worker const std::string content = "Hello, world!";
165*6777b538SAndroid Build Coastguard Worker memcpy(pre_mapping.memory(), content.data(), content.size());
166*6777b538SAndroid Build Coastguard Worker
167*6777b538SAndroid Build Coastguard Worker IPC::Message message;
168*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&message, pre_pickle);
169*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(pre_pickle.IsValid());
170*6777b538SAndroid Build Coastguard Worker
171*6777b538SAndroid Build Coastguard Worker TypeParam post_pickle;
172*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(message);
173*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&message, &iter, &post_pickle));
174*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(pre_size, post_pickle.GetSize());
175*6777b538SAndroid Build Coastguard Worker typename TypeParam::MappingType post_mapping = post_pickle.Map();
176*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(pre_mapping.guid(), post_mapping.guid());
177*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(pre_mapping.memory(), post_mapping.memory(),
178*6777b538SAndroid Build Coastguard Worker post_pickle.GetSize()));
179*6777b538SAndroid Build Coastguard Worker }
180*6777b538SAndroid Build Coastguard Worker
TYPED_TEST(SharedMemoryRegionTypedTest,InvalidRegion)181*6777b538SAndroid Build Coastguard Worker TYPED_TEST(SharedMemoryRegionTypedTest, InvalidRegion) {
182*6777b538SAndroid Build Coastguard Worker TypeParam pre_pickle;
183*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(pre_pickle.IsValid());
184*6777b538SAndroid Build Coastguard Worker
185*6777b538SAndroid Build Coastguard Worker IPC::Message message;
186*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&message, pre_pickle);
187*6777b538SAndroid Build Coastguard Worker
188*6777b538SAndroid Build Coastguard Worker TypeParam post_pickle;
189*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(message);
190*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&message, &iter, &post_pickle));
191*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(post_pickle.IsValid());
192*6777b538SAndroid Build Coastguard Worker }
193*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,UnguessableTokenTest)194*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, UnguessableTokenTest) {
195*6777b538SAndroid Build Coastguard Worker base::UnguessableToken token = base::UnguessableToken::Create();
196*6777b538SAndroid Build Coastguard Worker base::Pickle pickle;
197*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&pickle, token);
198*6777b538SAndroid Build Coastguard Worker
199*6777b538SAndroid Build Coastguard Worker std::string log;
200*6777b538SAndroid Build Coastguard Worker IPC::LogParam(token, &log);
201*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(token.ToString(), log);
202*6777b538SAndroid Build Coastguard Worker
203*6777b538SAndroid Build Coastguard Worker base::UnguessableToken deserialized_token;
204*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(pickle);
205*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&pickle, &iter, &deserialized_token));
206*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(token, deserialized_token);
207*6777b538SAndroid Build Coastguard Worker }
208*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,FlatMap)209*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, FlatMap) {
210*6777b538SAndroid Build Coastguard Worker base::flat_map<std::string, int> input;
211*6777b538SAndroid Build Coastguard Worker input["foo"] = 42;
212*6777b538SAndroid Build Coastguard Worker input["bar"] = 96;
213*6777b538SAndroid Build Coastguard Worker
214*6777b538SAndroid Build Coastguard Worker base::Pickle pickle;
215*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&pickle, input);
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(pickle);
218*6777b538SAndroid Build Coastguard Worker base::flat_map<std::string, int> output;
219*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(input, output);
222*6777b538SAndroid Build Coastguard Worker }
223*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,StrongAlias)224*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, StrongAlias) {
225*6777b538SAndroid Build Coastguard Worker using TestType = base::StrongAlias<class Tag, int>;
226*6777b538SAndroid Build Coastguard Worker TestType input(42);
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker base::Pickle pickle;
229*6777b538SAndroid Build Coastguard Worker IPC::WriteParam(&pickle, input);
230*6777b538SAndroid Build Coastguard Worker
231*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(pickle);
232*6777b538SAndroid Build Coastguard Worker TestType output;
233*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
234*6777b538SAndroid Build Coastguard Worker
235*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(input, output);
236*6777b538SAndroid Build Coastguard Worker }
237*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,DictValueConversion)238*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, DictValueConversion) {
239*6777b538SAndroid Build Coastguard Worker base::Value::Dict dict_value;
240*6777b538SAndroid Build Coastguard Worker dict_value.Set("path1", 42);
241*6777b538SAndroid Build Coastguard Worker dict_value.Set("path2", 84);
242*6777b538SAndroid Build Coastguard Worker base::Value::List subvalue;
243*6777b538SAndroid Build Coastguard Worker subvalue.Append(1234);
244*6777b538SAndroid Build Coastguard Worker subvalue.Append(5678);
245*6777b538SAndroid Build Coastguard Worker dict_value.Set("path3", std::move(subvalue));
246*6777b538SAndroid Build Coastguard Worker
247*6777b538SAndroid Build Coastguard Worker IPC::Message message;
248*6777b538SAndroid Build Coastguard Worker ParamTraits<base::Value::Dict>::Write(&message, dict_value);
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(message);
251*6777b538SAndroid Build Coastguard Worker base::Value::Dict read_value;
252*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(
253*6777b538SAndroid Build Coastguard Worker ParamTraits<base::Value::Dict>::Read(&message, &iter, &read_value));
254*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(dict_value, read_value);
255*6777b538SAndroid Build Coastguard Worker }
256*6777b538SAndroid Build Coastguard Worker
TEST(IPCMessageUtilsTest,ListValueConversion)257*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, ListValueConversion) {
258*6777b538SAndroid Build Coastguard Worker base::Value::List list_value;
259*6777b538SAndroid Build Coastguard Worker list_value.Append(42);
260*6777b538SAndroid Build Coastguard Worker list_value.Append(84);
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker IPC::Message message;
263*6777b538SAndroid Build Coastguard Worker ParamTraits<base::Value::List>::Write(&message, list_value);
264*6777b538SAndroid Build Coastguard Worker
265*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(message);
266*6777b538SAndroid Build Coastguard Worker base::Value::List read_value;
267*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(
268*6777b538SAndroid Build Coastguard Worker ParamTraits<base::Value::List>::Read(&message, &iter, &read_value));
269*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(list_value, read_value);
270*6777b538SAndroid Build Coastguard Worker }
271*6777b538SAndroid Build Coastguard Worker
272*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
TEST(IPCMessageUtilsTest,ScopedHandle)273*6777b538SAndroid Build Coastguard Worker TEST(IPCMessageUtilsTest, ScopedHandle) {
274*6777b538SAndroid Build Coastguard Worker HANDLE raw_dupe_handle;
275*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(::DuplicateHandle(::GetCurrentProcess(), ::GetCurrentProcess(),
276*6777b538SAndroid Build Coastguard Worker ::GetCurrentProcess(), &raw_dupe_handle, 0,
277*6777b538SAndroid Build Coastguard Worker FALSE, DUPLICATE_SAME_ACCESS));
278*6777b538SAndroid Build Coastguard Worker base::win::ScopedHandle dupe_handle(raw_dupe_handle);
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard Worker Message message(0, 0, Message::PRIORITY_LOW);
281*6777b538SAndroid Build Coastguard Worker WriteParam(&message, dupe_handle);
282*6777b538SAndroid Build Coastguard Worker
283*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter(message);
284*6777b538SAndroid Build Coastguard Worker base::win::ScopedHandle read_handle;
285*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadParam(&message, &iter, &read_handle));
286*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(read_handle.IsValid());
287*6777b538SAndroid Build Coastguard Worker }
288*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
289*6777b538SAndroid Build Coastguard Worker
290*6777b538SAndroid Build Coastguard Worker } // namespace
291*6777b538SAndroid Build Coastguard Worker } // namespace IPC
292