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

Side by Side Diff: mojo/public/cpp/bindings/tests/array_unittest.cc

Issue 469393004: Mojo: Add warning of invalid serialization results (in debug build). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/public/cpp/bindings/array.h" 5 #include "mojo/public/cpp/bindings/array.h"
6 #include "mojo/public/cpp/bindings/lib/array_internal.h"
6 #include "mojo/public/cpp/bindings/lib/array_serialization.h" 7 #include "mojo/public/cpp/bindings/lib/array_serialization.h"
7 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" 8 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
8 #include "mojo/public/cpp/environment/environment.h" 9 #include "mojo/public/cpp/environment/environment.h"
9 #include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 11
12 namespace mojo { 12 namespace mojo {
13 namespace test { 13 namespace test {
14 namespace { 14 namespace {
15 15
16 class CopyableType { 16 class CopyableType {
17 public: 17 public:
18 CopyableType() : copied_(false), ptr_(this) { num_instances_++; } 18 CopyableType() : copied_(false), ptr_(this) { num_instances_++; }
19 CopyableType(const CopyableType& other) : copied_(true), ptr_(other.ptr()) { 19 CopyableType(const CopyableType& other) : copied_(true), ptr_(other.ptr()) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 void ResetMoved() { moved_ = false; } 60 void ResetMoved() { moved_ = false; }
61 61
62 private: 62 private:
63 bool moved_; 63 bool moved_;
64 static size_t num_instances_; 64 static size_t num_instances_;
65 MoveOnlyType* ptr_; 65 MoveOnlyType* ptr_;
66 }; 66 };
67 67
68 size_t MoveOnlyType::num_instances_ = 0; 68 size_t MoveOnlyType::num_instances_ = 0;
69 69
70 class ArrayTest : public testing::Test {
71 public:
72 virtual ~ArrayTest() {}
73
74 private:
75 Environment env_;
76 };
77
70 // Tests that basic Array operations work. 78 // Tests that basic Array operations work.
71 TEST(ArrayTest, Basic) { 79 TEST_F(ArrayTest, Basic) {
72 Array<char> array(8); 80 Array<char> array(8);
73 for (size_t i = 0; i < array.size(); ++i) { 81 for (size_t i = 0; i < array.size(); ++i) {
74 char val = static_cast<char>(i*2); 82 char val = static_cast<char>(i*2);
75 array[i] = val; 83 array[i] = val;
76 EXPECT_EQ(val, array.at(i)); 84 EXPECT_EQ(val, array.at(i));
77 } 85 }
78 } 86 }
79 87
80 // Tests that basic Array<bool> operations work. 88 // Tests that basic Array<bool> operations work.
81 TEST(ArrayTest, Bool) { 89 TEST_F(ArrayTest, Bool) {
82 Array<bool> array(64); 90 Array<bool> array(64);
83 for (size_t i = 0; i < array.size(); ++i) { 91 for (size_t i = 0; i < array.size(); ++i) {
84 bool val = i % 3 == 0; 92 bool val = i % 3 == 0;
85 array[i] = val; 93 array[i] = val;
86 EXPECT_EQ(val, array.at(i)); 94 EXPECT_EQ(val, array.at(i));
87 } 95 }
88 } 96 }
89 97
90 // Tests that Array<ScopedMessagePipeHandle> supports transferring handles. 98 // Tests that Array<ScopedMessagePipeHandle> supports transferring handles.
91 TEST(ArrayTest, Handle) { 99 TEST_F(ArrayTest, Handle) {
92 MessagePipe pipe; 100 MessagePipe pipe;
93 Array<ScopedMessagePipeHandle> handles(2); 101 Array<ScopedMessagePipeHandle> handles(2);
94 handles[0] = pipe.handle0.Pass(); 102 handles[0] = pipe.handle0.Pass();
95 handles[1].reset(pipe.handle1.release()); 103 handles[1].reset(pipe.handle1.release());
96 104
97 EXPECT_FALSE(pipe.handle0.is_valid()); 105 EXPECT_FALSE(pipe.handle0.is_valid());
98 EXPECT_FALSE(pipe.handle1.is_valid()); 106 EXPECT_FALSE(pipe.handle1.is_valid());
99 107
100 Array<ScopedMessagePipeHandle> handles2 = handles.Pass(); 108 Array<ScopedMessagePipeHandle> handles2 = handles.Pass();
101 EXPECT_TRUE(handles2[0].is_valid()); 109 EXPECT_TRUE(handles2[0].is_valid());
102 EXPECT_TRUE(handles2[1].is_valid()); 110 EXPECT_TRUE(handles2[1].is_valid());
103 111
104 ScopedMessagePipeHandle pipe_handle = handles2[0].Pass(); 112 ScopedMessagePipeHandle pipe_handle = handles2[0].Pass();
105 EXPECT_TRUE(pipe_handle.is_valid()); 113 EXPECT_TRUE(pipe_handle.is_valid());
106 EXPECT_FALSE(handles2[0].is_valid()); 114 EXPECT_FALSE(handles2[0].is_valid());
107 } 115 }
108 116
109 // Tests that Array<ScopedMessagePipeHandle> supports closing handles. 117 // Tests that Array<ScopedMessagePipeHandle> supports closing handles.
110 TEST(ArrayTest, HandlesAreClosed) { 118 TEST_F(ArrayTest, HandlesAreClosed) {
111 MessagePipe pipe; 119 MessagePipe pipe;
112 MojoHandle pipe0_value = pipe.handle0.get().value(); 120 MojoHandle pipe0_value = pipe.handle0.get().value();
113 MojoHandle pipe1_value = pipe.handle0.get().value(); 121 MojoHandle pipe1_value = pipe.handle0.get().value();
114 122
115 { 123 {
116 Array<ScopedMessagePipeHandle> handles(2); 124 Array<ScopedMessagePipeHandle> handles(2);
117 handles[0] = pipe.handle0.Pass(); 125 handles[0] = pipe.handle0.Pass();
118 handles[1].reset(pipe.handle0.release()); 126 handles[1].reset(pipe.handle0.release());
119 } 127 }
120 128
121 // We expect the pipes to have been closed. 129 // We expect the pipes to have been closed.
122 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value)); 130 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe0_value));
123 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value)); 131 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(pipe1_value));
124 } 132 }
125 133
126 TEST(ArrayTest, Serialization_ArrayOfPOD) { 134 TEST_F(ArrayTest, Serialization_ArrayOfPOD) {
127 Array<int32_t> array(4); 135 Array<int32_t> array(4);
128 for (size_t i = 0; i < array.size(); ++i) 136 for (size_t i = 0; i < array.size(); ++i)
129 array[i] = static_cast<int32_t>(i); 137 array[i] = static_cast<int32_t>(i);
130 138
131 size_t size = GetSerializedSize_(array); 139 size_t size = GetSerializedSize_(array);
132 EXPECT_EQ(8U + 4*4U, size); 140 EXPECT_EQ(8U + 4*4U, size);
133 141
134 internal::FixedBuffer buf(size); 142 internal::FixedBuffer buf(size);
135 internal::Array_Data<int32_t>* data; 143 internal::Array_Data<int32_t>* data;
136 Serialize_(array.Pass(), &buf, &data); 144 SerializeArray_<internal::ArrayValidateParams<0, false,
145 internal::NoValidateParams> >(
146 array.Pass(), &buf, &data);
137 147
138 Array<int32_t> array2; 148 Array<int32_t> array2;
139 Deserialize_(data, &array2); 149 Deserialize_(data, &array2);
140 150
141 EXPECT_EQ(4U, array2.size()); 151 EXPECT_EQ(4U, array2.size());
142 for (size_t i = 0; i < array2.size(); ++i) 152 for (size_t i = 0; i < array2.size(); ++i)
143 EXPECT_EQ(static_cast<int32_t>(i), array2[i]); 153 EXPECT_EQ(static_cast<int32_t>(i), array2[i]);
144 } 154 }
145 155
146 TEST(ArrayTest, Serialization_ArrayOfArrayOfPOD) { 156 TEST_F(ArrayTest, Serialization_ArrayOfArrayOfPOD) {
147 Array<Array<int32_t> > array(2); 157 Array<Array<int32_t> > array(2);
148 for (size_t j = 0; j < array.size(); ++j) { 158 for (size_t j = 0; j < array.size(); ++j) {
149 Array<int32_t> inner(4); 159 Array<int32_t> inner(4);
150 for (size_t i = 0; i < inner.size(); ++i) 160 for (size_t i = 0; i < inner.size(); ++i)
151 inner[i] = static_cast<int32_t>(i + (j * 10)); 161 inner[i] = static_cast<int32_t>(i + (j * 10));
152 array[j] = inner.Pass(); 162 array[j] = inner.Pass();
153 } 163 }
154 164
155 size_t size = GetSerializedSize_(array); 165 size_t size = GetSerializedSize_(array);
156 EXPECT_EQ(8U + 2*8U + 2*(8U + 4*4U), size); 166 EXPECT_EQ(8U + 2*8U + 2*(8U + 4*4U), size);
157 167
158 internal::FixedBuffer buf(size); 168 internal::FixedBuffer buf(size);
159 internal::Array_Data<internal::Array_Data<int32_t>*>* data; 169 internal::Array_Data<internal::Array_Data<int32_t>*>* data;
160 Serialize_(array.Pass(), &buf, &data); 170 SerializeArray_<internal::ArrayValidateParams<0, false,
171 internal::ArrayValidateParams<0, false,
172 internal::NoValidateParams> > >(
173 array.Pass(), &buf, &data);
161 174
162 Array<Array<int32_t> > array2; 175 Array<Array<int32_t> > array2;
163 Deserialize_(data, &array2); 176 Deserialize_(data, &array2);
164 177
165 EXPECT_EQ(2U, array2.size()); 178 EXPECT_EQ(2U, array2.size());
166 for (size_t j = 0; j < array2.size(); ++j) { 179 for (size_t j = 0; j < array2.size(); ++j) {
167 const Array<int32_t>& inner = array2[j]; 180 const Array<int32_t>& inner = array2[j];
168 EXPECT_EQ(4U, inner.size()); 181 EXPECT_EQ(4U, inner.size());
169 for (size_t i = 0; i < inner.size(); ++i) 182 for (size_t i = 0; i < inner.size(); ++i)
170 EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]); 183 EXPECT_EQ(static_cast<int32_t>(i + (j * 10)), inner[i]);
171 } 184 }
172 } 185 }
173 186
174 TEST(ArrayTest, Serialization_ArrayOfBool) { 187 TEST_F(ArrayTest, Serialization_ArrayOfBool) {
175 Array<bool> array(10); 188 Array<bool> array(10);
176 for (size_t i = 0; i < array.size(); ++i) 189 for (size_t i = 0; i < array.size(); ++i)
177 array[i] = i % 2 ? true : false; 190 array[i] = i % 2 ? true : false;
178 191
179 size_t size = GetSerializedSize_(array); 192 size_t size = GetSerializedSize_(array);
180 EXPECT_EQ(8U + 8U, size); 193 EXPECT_EQ(8U + 8U, size);
181 194
182 internal::FixedBuffer buf(size); 195 internal::FixedBuffer buf(size);
183 internal::Array_Data<bool>* data; 196 internal::Array_Data<bool>* data;
184 Serialize_(array.Pass(), &buf, &data); 197 SerializeArray_<internal::ArrayValidateParams<0, false,
198 internal::NoValidateParams> >(
199 array.Pass(), &buf, &data);
185 200
186 Array<bool> array2; 201 Array<bool> array2;
187 Deserialize_(data, &array2); 202 Deserialize_(data, &array2);
188 203
189 EXPECT_EQ(10U, array2.size()); 204 EXPECT_EQ(10U, array2.size());
190 for (size_t i = 0; i < array2.size(); ++i) 205 for (size_t i = 0; i < array2.size(); ++i)
191 EXPECT_EQ(i % 2 ? true : false, array2[i]); 206 EXPECT_EQ(i % 2 ? true : false, array2[i]);
192 } 207 }
193 208
194 TEST(ArrayTest, Serialization_ArrayOfString) { 209 TEST_F(ArrayTest, Serialization_ArrayOfString) {
195 Array<String> array(10); 210 Array<String> array(10);
196 for (size_t i = 0; i < array.size(); ++i) { 211 for (size_t i = 0; i < array.size(); ++i) {
197 char c = 'A' + 1; 212 char c = 'A' + static_cast<char>(i);
198 array[i] = String(&c, 1); 213 array[i] = String(&c, 1);
199 } 214 }
200 215
201 size_t size = GetSerializedSize_(array); 216 size_t size = GetSerializedSize_(array);
202 EXPECT_EQ(8U + // array header 217 EXPECT_EQ(8U + // array header
203 10*8U + // array payload (10 pointers) 218 10*8U + // array payload (10 pointers)
204 10*(8U + // string header 219 10*(8U + // string header
205 8U), // string length of 1 padded to 8 220 8U), // string length of 1 padded to 8
206 size); 221 size);
207 222
208 internal::FixedBuffer buf(size); 223 internal::FixedBuffer buf(size);
209 internal::Array_Data<internal::String_Data*>* data; 224 internal::Array_Data<internal::String_Data*>* data;
210 Serialize_(array.Pass(), &buf, &data); 225 SerializeArray_<internal::ArrayValidateParams<0, false,
226 internal::ArrayValidateParams<0, false,
227 internal::NoValidateParams> > >(
228 array.Pass(), &buf, &data);
211 229
212 Array<String> array2; 230 Array<String> array2;
213 Deserialize_(data, &array2); 231 Deserialize_(data, &array2);
214 232
215 EXPECT_EQ(10U, array2.size()); 233 EXPECT_EQ(10U, array2.size());
216 for (size_t i = 0; i < array2.size(); ++i) { 234 for (size_t i = 0; i < array2.size(); ++i) {
217 char c = 'A' + 1; 235 char c = 'A' + static_cast<char>(i);
218 EXPECT_EQ(String(&c, 1), array2[i]); 236 EXPECT_EQ(String(&c, 1), array2[i]);
219 } 237 }
220 } 238 }
221 239
222 TEST(ArrayTest, Resize_Copyable) { 240 TEST_F(ArrayTest, Resize_Copyable) {
223 ASSERT_EQ(0u, CopyableType::num_instances()); 241 ASSERT_EQ(0u, CopyableType::num_instances());
224 mojo::Array<CopyableType> array(3); 242 mojo::Array<CopyableType> array(3);
225 std::vector<CopyableType*> value_ptrs; 243 std::vector<CopyableType*> value_ptrs;
226 value_ptrs.push_back(array[0].ptr()); 244 value_ptrs.push_back(array[0].ptr());
227 value_ptrs.push_back(array[1].ptr()); 245 value_ptrs.push_back(array[1].ptr());
228 246
229 for (size_t i = 0; i < array.size(); i++) 247 for (size_t i = 0; i < array.size(); i++)
230 array[i].ResetCopied(); 248 array[i].ResetCopied();
231 249
232 array.resize(2); 250 array.resize(2);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 EXPECT_EQ(value_ptrs[i], array[i].ptr()); 282 EXPECT_EQ(value_ptrs[i], array[i].ptr());
265 } 283 }
266 array.reset(); 284 array.reset();
267 EXPECT_EQ(0u, CopyableType::num_instances()); 285 EXPECT_EQ(0u, CopyableType::num_instances());
268 EXPECT_FALSE(array); 286 EXPECT_FALSE(array);
269 array.resize(0); 287 array.resize(0);
270 EXPECT_EQ(0u, CopyableType::num_instances()); 288 EXPECT_EQ(0u, CopyableType::num_instances());
271 EXPECT_TRUE(array); 289 EXPECT_TRUE(array);
272 } 290 }
273 291
274 TEST(ArrayTest, Resize_MoveOnly) { 292 TEST_F(ArrayTest, Resize_MoveOnly) {
275 ASSERT_EQ(0u, MoveOnlyType::num_instances()); 293 ASSERT_EQ(0u, MoveOnlyType::num_instances());
276 mojo::Array<MoveOnlyType> array(3); 294 mojo::Array<MoveOnlyType> array(3);
277 std::vector<MoveOnlyType*> value_ptrs; 295 std::vector<MoveOnlyType*> value_ptrs;
278 value_ptrs.push_back(array[0].ptr()); 296 value_ptrs.push_back(array[0].ptr());
279 value_ptrs.push_back(array[1].ptr()); 297 value_ptrs.push_back(array[1].ptr());
280 298
281 for (size_t i = 0; i < array.size(); i++) 299 for (size_t i = 0; i < array.size(); i++)
282 EXPECT_FALSE(array[i].moved()); 300 EXPECT_FALSE(array[i].moved());
283 301
284 array.resize(2); 302 array.resize(2);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 EXPECT_FALSE(array[i].moved()); 334 EXPECT_FALSE(array[i].moved());
317 335
318 array.reset(); 336 array.reset();
319 EXPECT_EQ(0u, MoveOnlyType::num_instances()); 337 EXPECT_EQ(0u, MoveOnlyType::num_instances());
320 EXPECT_FALSE(array); 338 EXPECT_FALSE(array);
321 array.resize(0); 339 array.resize(0);
322 EXPECT_EQ(0u, MoveOnlyType::num_instances()); 340 EXPECT_EQ(0u, MoveOnlyType::num_instances());
323 EXPECT_TRUE(array); 341 EXPECT_TRUE(array);
324 } 342 }
325 343
326 TEST(ArrayTest, PushBack_Copyable) { 344 TEST_F(ArrayTest, PushBack_Copyable) {
327 ASSERT_EQ(0u, CopyableType::num_instances()); 345 ASSERT_EQ(0u, CopyableType::num_instances());
328 mojo::Array<CopyableType> array(2); 346 mojo::Array<CopyableType> array(2);
329 array.reset(); 347 array.reset();
330 std::vector<CopyableType*> value_ptrs; 348 std::vector<CopyableType*> value_ptrs;
331 size_t capacity = array.storage().capacity(); 349 size_t capacity = array.storage().capacity();
332 for (size_t i = 0; i < capacity; i++) { 350 for (size_t i = 0; i < capacity; i++) {
333 CopyableType value; 351 CopyableType value;
334 value_ptrs.push_back(value.ptr()); 352 value_ptrs.push_back(value.ptr());
335 array.push_back(value); 353 array.push_back(value);
336 ASSERT_EQ(i + 1, array.size()); 354 ASSERT_EQ(i + 1, array.size());
(...skipping 14 matching lines...) Expand all
351 EXPECT_EQ(array.size(), CopyableType::num_instances()); 369 EXPECT_EQ(array.size(), CopyableType::num_instances());
352 370
353 for (size_t i = 0; i < array.size(); i++) { 371 for (size_t i = 0; i < array.size(); i++) {
354 EXPECT_TRUE(array[i].copied()); 372 EXPECT_TRUE(array[i].copied());
355 EXPECT_EQ(value_ptrs[i], array[i].ptr()); 373 EXPECT_EQ(value_ptrs[i], array[i].ptr());
356 } 374 }
357 array.reset(); 375 array.reset();
358 EXPECT_EQ(0u, CopyableType::num_instances()); 376 EXPECT_EQ(0u, CopyableType::num_instances());
359 } 377 }
360 378
361 TEST(ArrayTest, PushBack_MoveOnly) { 379 TEST_F(ArrayTest, PushBack_MoveOnly) {
362 ASSERT_EQ(0u, MoveOnlyType::num_instances()); 380 ASSERT_EQ(0u, MoveOnlyType::num_instances());
363 mojo::Array<MoveOnlyType> array(2); 381 mojo::Array<MoveOnlyType> array(2);
364 array.reset(); 382 array.reset();
365 std::vector<MoveOnlyType*> value_ptrs; 383 std::vector<MoveOnlyType*> value_ptrs;
366 size_t capacity = array.storage().capacity(); 384 size_t capacity = array.storage().capacity();
367 for (size_t i = 0; i < capacity; i++) { 385 for (size_t i = 0; i < capacity; i++) {
368 MoveOnlyType value; 386 MoveOnlyType value;
369 value_ptrs.push_back(value.ptr()); 387 value_ptrs.push_back(value.ptr());
370 array.push_back(value.Pass()); 388 array.push_back(value.Pass());
371 ASSERT_EQ(i + 1, array.size()); 389 ASSERT_EQ(i + 1, array.size());
(...skipping 17 matching lines...) Expand all
389 EXPECT_TRUE(array[i].moved()); 407 EXPECT_TRUE(array[i].moved());
390 EXPECT_EQ(value_ptrs[i], array[i].ptr()); 408 EXPECT_EQ(value_ptrs[i], array[i].ptr());
391 } 409 }
392 array.reset(); 410 array.reset();
393 EXPECT_EQ(0u, MoveOnlyType::num_instances()); 411 EXPECT_EQ(0u, MoveOnlyType::num_instances());
394 } 412 }
395 413
396 } // namespace 414 } // namespace
397 } // namespace test 415 } // namespace test
398 } // namespace mojo 416 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/lib/validation_errors.cc ('k') | mojo/public/cpp/bindings/tests/serialization_warning_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698