1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ipc/ipc_message_utils.h"
7 #include "base/files/file_path.h"
8 #include "ipc/ipc_message.h"
9 #include "testing/gtest/include/gtest/gtest.h"
14 // Tests nesting of messages as parameters to other messages.
15 TEST(IPCMessageUtilsTest
, NestedMessages
) {
16 int32 nested_routing
= 12;
17 uint32 nested_type
= 78;
18 int nested_content
= 456789;
19 Message::PriorityValue nested_priority
= Message::PRIORITY_HIGH
;
20 Message
nested_msg(nested_routing
, nested_type
, nested_priority
);
21 nested_msg
.set_sync();
22 ParamTraits
<int>::Write(&nested_msg
, nested_content
);
24 // Outer message contains the nested one as its parameter.
25 int32 outer_routing
= 91;
26 uint32 outer_type
= 88;
27 Message::PriorityValue outer_priority
= Message::PRIORITY_NORMAL
;
28 Message
outer_msg(outer_routing
, outer_type
, outer_priority
);
29 ParamTraits
<Message
>::Write(&outer_msg
, nested_msg
);
31 // Read back the nested message.
32 base::PickleIterator
iter(outer_msg
);
33 IPC::Message result_msg
;
34 ASSERT_TRUE(ParamTraits
<Message
>::Read(&outer_msg
, &iter
, &result_msg
));
36 // Verify nested message headers.
37 EXPECT_EQ(nested_msg
.routing_id(), result_msg
.routing_id());
38 EXPECT_EQ(nested_msg
.type(), result_msg
.type());
39 EXPECT_EQ(nested_msg
.priority(), result_msg
.priority());
40 EXPECT_EQ(nested_msg
.flags(), result_msg
.flags());
42 // Verify nested message content
43 base::PickleIterator
nested_iter(nested_msg
);
44 int result_content
= 0;
45 ASSERT_TRUE(ParamTraits
<int>::Read(&nested_msg
, &nested_iter
,
47 EXPECT_EQ(nested_content
, result_content
);
49 // Try reading past the ends for both messages and make sure it fails.
51 ASSERT_FALSE(ParamTraits
<Message
>::Read(&outer_msg
, &iter
, &dummy
));
52 ASSERT_FALSE(ParamTraits
<int>::Read(&nested_msg
, &nested_iter
,
56 // Tests that detection of various bad parameters is working correctly.
57 TEST(IPCMessageUtilsTest
, ParameterValidation
) {
58 base::FilePath::StringType
ok_string(FILE_PATH_LITERAL("hello"), 5);
59 base::FilePath::StringType
bad_string(FILE_PATH_LITERAL("hel\0o"), 5);
61 // Change this if ParamTraits<FilePath>::Write() changes.
63 ParamTraits
<base::FilePath::StringType
>::Write(&message
, ok_string
);
64 ParamTraits
<base::FilePath::StringType
>::Write(&message
, bad_string
);
66 base::PickleIterator
iter(message
);
67 base::FilePath ok_path
;
68 base::FilePath bad_path
;
69 ASSERT_TRUE(ParamTraits
<base::FilePath
>::Read(&message
, &iter
, &ok_path
));
70 ASSERT_FALSE(ParamTraits
<base::FilePath
>::Read(&message
, &iter
, &bad_path
));
74 TEST(IPCMessageUtilsTest
, StackVector
) {
75 static const size_t stack_capacity
= 5;
76 base::StackVector
<double, stack_capacity
> stack_vector
;
77 for (size_t i
= 0; i
< 2 * stack_capacity
; i
++)
78 stack_vector
->push_back(i
* 2.0);
80 IPC::Message
msg(1, 2, IPC::Message::PRIORITY_NORMAL
);
81 IPC::WriteParam(&msg
, stack_vector
);
83 base::StackVector
<double, stack_capacity
> output
;
84 base::PickleIterator
iter(msg
);
85 EXPECT_TRUE(IPC::ReadParam(&msg
, &iter
, &output
));
86 for (size_t i
= 0; i
< 2 * stack_capacity
; i
++)
87 EXPECT_EQ(stack_vector
[i
], output
[i
]);