Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(481)

Side by Side Diff: ipc/ipc_message_protobuf_utils_unittest.cc

Issue 2968003005: Support Serializing and Deserializing RepeatedField / RepeatedPtrField in IPC::Message (Closed)
Patch Set: Resolve review comments Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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.
4
5 #include "build/build_config.h"
6
7 #if defined(OS_NACL_NONSFI)
8 static_assert(false,
9 "ipc_message_protobuf_utils is not able to work with nacl_nonsfi "
10 "configuration.");
11 #endif
12
13 #include "ipc/ipc_message_protobuf_utils.h"
14
15 #include <initializer_list>
16
17 #include "ipc/test_proto.pb.h"
18 #include "ipc/ipc_message.h"
19 #include "ipc/ipc_message_utils.h"
20 #include "testing/gtest/include/gtest/gtest.h"
21
22 namespace IPC {
23
24 template <>
25 struct ParamTraits<ipc_message_utils_test::TestMessage1> {
26 typedef ipc_message_utils_test::TestMessage1 param_type;
27 static void GetSize(base::PickleSizer* sizer, const param_type& p) {
28 GetParamSize(sizer, p.number());
29 }
30 static void Write(base::Pickle* m, const param_type& p) {
31 WriteParam(m, p.number());
32 }
33 static bool Read(const base::Pickle* m,
34 base::PickleIterator* iter,
35 param_type* r) {
36 int number;
37 if (!iter->ReadInt(&number))
38 return false;
39 r->set_number(number);
40 return true;
41 }
42 };
43
44 template <>
45 struct ParamTraits<ipc_message_utils_test::TestMessage2> {
46 typedef ipc_message_utils_test::TestMessage2 param_type;
47 static void GetSize(base::PickleSizer* sizer, const param_type& p) {
48 GetParamSize(sizer, p.numbers());
49 GetParamSize(sizer, p.strings());
50 GetParamSize(sizer, p.messages());
51 }
52 static void Write(base::Pickle* m, const param_type& p) {
53 WriteParam(m, p.numbers());
54 WriteParam(m, p.strings());
55 WriteParam(m, p.messages());
56 }
57 static bool Read(const base::Pickle* m,
58 base::PickleIterator* iter,
59 param_type* r) {
60 return ReadParam(m, iter, r->mutable_numbers()) &&
61 ReadParam(m, iter, r->mutable_strings()) &&
62 ReadParam(m, iter, r->mutable_messages());
63 }
64 };
65
66 namespace {
67
68 template <class P1, class P2>
69 void AssertEqual(const P1& left, const P2& right) {
70 ASSERT_EQ(left, right);
71 }
72
73 template<>
74 void AssertEqual(const int& left,
75 const ipc_message_utils_test::TestMessage1& right) {
76 ASSERT_EQ(left, right.number());
77 }
78
79 template <template<class> class RepeatedFieldLike, class P1, class P2>
80 void AssertRepeatedFieldEquals(std::initializer_list<P1> expected,
81 const RepeatedFieldLike<P2>& fields) {
82 ASSERT_EQ(static_cast<int>(expected.size()), fields.size());
83 auto it = expected.begin();
84 int i = 0;
85 for (; it != expected.end(); it++, i++) {
86 AssertEqual(*it, fields.Get(i));
87 }
88 }
89
90 TEST(IPCMessageRepeatedFieldUtilsTest, RepeatedFieldShouldBeSerialized) {
91 ipc_message_utils_test::TestMessage2 message;
92 message.add_numbers(1);
93 message.add_numbers(100);
94 message.add_strings("abc");
95 message.add_strings("def");
96 message.add_messages()->set_number(1000);
97 message.add_messages()->set_number(10000);
98
99 base::Pickle pickle;
100 IPC::WriteParam(&pickle, message);
101
102 base::PickleSizer sizer;
103 IPC::GetParamSize(&sizer, message);
104
105 ASSERT_EQ(sizer.payload_size(), pickle.payload_size());
106
107 base::PickleIterator iter(pickle);
108 ipc_message_utils_test::TestMessage2 output;
109 ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
110
111 AssertRepeatedFieldEquals({1, 100}, output.numbers());
112 AssertRepeatedFieldEquals({"abc", "def"}, output.strings());
113 AssertRepeatedFieldEquals({1000, 10000}, output.messages());
114 }
115
116 TEST(IPCMessageRepeatedFieldUtilsTest,
117 PartialEmptyRepeatedFieldShouldBeSerialized) {
118 ipc_message_utils_test::TestMessage2 message;
119 message.add_numbers(1);
120 message.add_numbers(100);
121 message.add_messages()->set_number(1000);
122 message.add_messages()->set_number(10000);
123
124 base::Pickle pickle;
125 IPC::WriteParam(&pickle, message);
126
127 base::PickleSizer sizer;
128 IPC::GetParamSize(&sizer, message);
129
130 ASSERT_EQ(sizer.payload_size(), pickle.payload_size());
131
132 base::PickleIterator iter(pickle);
133 ipc_message_utils_test::TestMessage2 output;
134 ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
135
136 AssertRepeatedFieldEquals({1, 100}, output.numbers());
137 ASSERT_EQ(0, output.strings_size());
138 AssertRepeatedFieldEquals({1000, 10000}, output.messages());
139 }
140
141 TEST(IPCMessageRepeatedFieldUtilsTest, EmptyRepeatedFieldShouldBeSerialized) {
142 ipc_message_utils_test::TestMessage2 message;
143
144 base::Pickle pickle;
145 IPC::WriteParam(&pickle, message);
146
147 base::PickleSizer sizer;
148 IPC::GetParamSize(&sizer, message);
149
150 ASSERT_EQ(sizer.payload_size(), pickle.payload_size());
151
152 base::PickleIterator iter(pickle);
153 ipc_message_utils_test::TestMessage2 output;
154 ASSERT_TRUE(IPC::ReadParam(&pickle, &iter, &output));
155
156 ASSERT_EQ(0, output.numbers_size());
157 ASSERT_EQ(0, output.strings_size());
158 ASSERT_EQ(0, output.messages_size());
159 }
160
161 TEST(IPCMessageRepeatedFieldUtilsTest,
162 InvalidPickleShouldNotCrashRepeatedFieldDeserialization) {
163 base::Pickle pickle;
164 IPC::WriteParam(&pickle, INT_MAX);
165 IPC::WriteParam(&pickle, 0);
166 IPC::WriteParam(&pickle, INT_MAX);
167 IPC::WriteParam(&pickle, std::string());
168 IPC::WriteParam(&pickle, 0);
169
170 base::PickleIterator iter(pickle);
171 ipc_message_utils_test::TestMessage2 output;
172 ASSERT_FALSE(IPC::ReadParam(&pickle, &iter, &output));
173 }
174
175 // This test needs ~20 seconds in Debug mode, or ~4 seconds in Release mode.
176 // See http://crbug.com/741866 for details.
177 TEST(IPCMessageRepeatedFieldUtilsTest,
178 DISABLED_InvalidPickleShouldNotCrashRepeatedFieldDeserialization2) {
179 base::Pickle pickle;
180 IPC::WriteParam(&pickle, 256 * 1024 * 1024);
181 IPC::WriteParam(&pickle, 0);
182 IPC::WriteParam(&pickle, INT_MAX);
183 IPC::WriteParam(&pickle, std::string());
184 IPC::WriteParam(&pickle, 0);
185
186 base::PickleIterator iter(pickle);
187 ipc_message_utils_test::TestMessage2 output;
188 ASSERT_FALSE(IPC::ReadParam(&pickle, &iter, &output));
189 }
190
191 } // namespace
192
193 } // namespace IPC
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698