OLD | NEW |
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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
12 #include "mojo/public/cpp/bindings/array.h" | 12 #include "mojo/public/cpp/bindings/array.h" |
13 #include "mojo/public/cpp/bindings/binding.h" | 13 #include "mojo/public/cpp/bindings/binding.h" |
14 #include "mojo/public/cpp/bindings/lib/array_internal.h" | 14 #include "mojo/public/cpp/bindings/lib/array_internal.h" |
15 #include "mojo/public/cpp/bindings/lib/bounds_checker.h" | |
16 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" | 15 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" |
17 #include "mojo/public/cpp/bindings/lib/serialization.h" | 16 #include "mojo/public/cpp/bindings/lib/serialization.h" |
| 17 #include "mojo/public/cpp/bindings/lib/validation_context.h" |
18 #include "mojo/public/cpp/bindings/string.h" | 18 #include "mojo/public/cpp/bindings/string.h" |
19 #include "mojo/public/cpp/test_support/test_utils.h" | 19 #include "mojo/public/cpp/test_support/test_utils.h" |
20 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" | 20 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" |
21 #include "mojo/public/interfaces/bindings/tests/test_unions.mojom.h" | 21 #include "mojo/public/interfaces/bindings/tests/test_unions.mojom.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
23 | 23 |
24 namespace mojo { | 24 namespace mojo { |
25 namespace test { | 25 namespace test { |
26 | 26 |
27 TEST(UnionTest, PlainOldDataGetterSetter) { | 27 TEST(UnionTest, PlainOldDataGetterSetter) { |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 size_t size = | 165 size_t size = |
166 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); | 166 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); |
167 EXPECT_EQ(16U, size); | 167 EXPECT_EQ(16U, size); |
168 | 168 |
169 mojo::internal::FixedBufferForTesting buf(size); | 169 mojo::internal::FixedBufferForTesting buf(size); |
170 internal::PodUnion_Data* data = nullptr; | 170 internal::PodUnion_Data* data = nullptr; |
171 mojo::internal::Serialize<PodUnionPtr>(pod, &buf, &data, false, nullptr); | 171 mojo::internal::Serialize<PodUnionPtr>(pod, &buf, &data, false, nullptr); |
172 data->EncodePointers(); | 172 data->EncodePointers(); |
173 | 173 |
174 void* raw_buf = buf.Leak(); | 174 void* raw_buf = buf.Leak(); |
175 mojo::internal::BoundsChecker bounds_checker(data, | 175 mojo::internal::ValidationContext validation_context( |
176 static_cast<uint32_t>(size), 0); | 176 data, static_cast<uint32_t>(size), 0); |
177 EXPECT_TRUE( | 177 EXPECT_TRUE( |
178 internal::PodUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 178 internal::PodUnion_Data::Validate(raw_buf, &validation_context, false)); |
179 free(raw_buf); | 179 free(raw_buf); |
180 } | 180 } |
181 | 181 |
182 TEST(UnionTest, SerializeNotNull) { | 182 TEST(UnionTest, SerializeNotNull) { |
183 PodUnionPtr pod(PodUnion::New()); | 183 PodUnionPtr pod(PodUnion::New()); |
184 pod->set_f_int8(0); | 184 pod->set_f_int8(0); |
185 size_t size = | 185 size_t size = |
186 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); | 186 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); |
187 mojo::internal::FixedBufferForTesting buf(size); | 187 mojo::internal::FixedBufferForTesting buf(size); |
188 internal::PodUnion_Data* data = nullptr; | 188 internal::PodUnion_Data* data = nullptr; |
(...skipping 28 matching lines...) Expand all Loading... |
217 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); | 217 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); |
218 EXPECT_EQ(16U, size); | 218 EXPECT_EQ(16U, size); |
219 mojo::internal::FixedBufferForTesting buf(size); | 219 mojo::internal::FixedBufferForTesting buf(size); |
220 internal::PodUnion_Data* data = nullptr; | 220 internal::PodUnion_Data* data = nullptr; |
221 mojo::internal::Serialize<PodUnionPtr>(pod, &buf, &data, false, nullptr); | 221 mojo::internal::Serialize<PodUnionPtr>(pod, &buf, &data, false, nullptr); |
222 EXPECT_EQ(nullptr, data); | 222 EXPECT_EQ(nullptr, data); |
223 } | 223 } |
224 | 224 |
225 TEST(UnionTest, NullValidation) { | 225 TEST(UnionTest, NullValidation) { |
226 void* buf = nullptr; | 226 void* buf = nullptr; |
227 mojo::internal::BoundsChecker bounds_checker(buf, 0, 0); | 227 mojo::internal::ValidationContext validation_context(buf, 0, 0); |
228 EXPECT_TRUE(internal::PodUnion_Data::Validate(buf, &bounds_checker, false)); | 228 EXPECT_TRUE(internal::PodUnion_Data::Validate( |
| 229 buf, &validation_context, false)); |
229 } | 230 } |
230 | 231 |
231 TEST(UnionTest, OutOfAlignmentValidation) { | 232 TEST(UnionTest, OutOfAlignmentValidation) { |
232 size_t size = sizeof(internal::PodUnion_Data); | 233 size_t size = sizeof(internal::PodUnion_Data); |
233 // Get an aligned object and shift the alignment. | 234 // Get an aligned object and shift the alignment. |
234 mojo::internal::FixedBufferForTesting aligned_buf(size + 1); | 235 mojo::internal::FixedBufferForTesting aligned_buf(size + 1); |
235 void* raw_buf = aligned_buf.Leak(); | 236 void* raw_buf = aligned_buf.Leak(); |
236 char* buf = reinterpret_cast<char*>(raw_buf) + 1; | 237 char* buf = reinterpret_cast<char*>(raw_buf) + 1; |
237 | 238 |
238 internal::PodUnion_Data* data = | 239 internal::PodUnion_Data* data = |
239 reinterpret_cast<internal::PodUnion_Data*>(buf); | 240 reinterpret_cast<internal::PodUnion_Data*>(buf); |
240 mojo::internal::BoundsChecker bounds_checker(data, | 241 mojo::internal::ValidationContext validation_context( |
241 static_cast<uint32_t>(size), 0); | 242 data, static_cast<uint32_t>(size), 0); |
242 EXPECT_FALSE(internal::PodUnion_Data::Validate(buf, &bounds_checker, false)); | 243 EXPECT_FALSE(internal::PodUnion_Data::Validate( |
| 244 buf, &validation_context, false)); |
243 free(raw_buf); | 245 free(raw_buf); |
244 } | 246 } |
245 | 247 |
246 TEST(UnionTest, OOBValidation) { | 248 TEST(UnionTest, OOBValidation) { |
247 size_t size = sizeof(internal::PodUnion_Data) - 1; | 249 size_t size = sizeof(internal::PodUnion_Data) - 1; |
248 mojo::internal::FixedBufferForTesting buf(size); | 250 mojo::internal::FixedBufferForTesting buf(size); |
249 internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf); | 251 internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf); |
250 mojo::internal::BoundsChecker bounds_checker(data, | 252 mojo::internal::ValidationContext validation_context( |
251 static_cast<uint32_t>(size), 0); | 253 data, static_cast<uint32_t>(size), 0); |
252 void* raw_buf = buf.Leak(); | 254 void* raw_buf = buf.Leak(); |
253 EXPECT_FALSE( | 255 EXPECT_FALSE( |
254 internal::PodUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 256 internal::PodUnion_Data::Validate(raw_buf, &validation_context, false)); |
255 free(raw_buf); | 257 free(raw_buf); |
256 } | 258 } |
257 | 259 |
258 TEST(UnionTest, UnknownTagValidation) { | 260 TEST(UnionTest, UnknownTagValidation) { |
259 size_t size = sizeof(internal::PodUnion_Data); | 261 size_t size = sizeof(internal::PodUnion_Data); |
260 mojo::internal::FixedBufferForTesting buf(size); | 262 mojo::internal::FixedBufferForTesting buf(size); |
261 internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf); | 263 internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf); |
262 data->tag = static_cast<internal::PodUnion_Data::PodUnion_Tag>(0xFFFFFF); | 264 data->tag = static_cast<internal::PodUnion_Data::PodUnion_Tag>(0xFFFFFF); |
263 mojo::internal::BoundsChecker bounds_checker(data, | 265 mojo::internal::ValidationContext validation_context( |
264 static_cast<uint32_t>(size), 0); | 266 data, static_cast<uint32_t>(size), 0); |
265 void* raw_buf = buf.Leak(); | 267 void* raw_buf = buf.Leak(); |
266 EXPECT_FALSE( | 268 EXPECT_FALSE( |
267 internal::PodUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 269 internal::PodUnion_Data::Validate(raw_buf, &validation_context, false)); |
268 free(raw_buf); | 270 free(raw_buf); |
269 } | 271 } |
270 | 272 |
271 TEST(UnionTest, UnknownEnumValueValidation) { | 273 TEST(UnionTest, UnknownEnumValueValidation) { |
272 PodUnionPtr pod(PodUnion::New()); | 274 PodUnionPtr pod(PodUnion::New()); |
273 pod->set_f_enum(static_cast<AnEnum>(0xFFFF)); | 275 pod->set_f_enum(static_cast<AnEnum>(0xFFFF)); |
274 | 276 |
275 size_t size = | 277 size_t size = |
276 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); | 278 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); |
277 EXPECT_EQ(16U, size); | 279 EXPECT_EQ(16U, size); |
278 | 280 |
279 mojo::internal::FixedBufferForTesting buf(size); | 281 mojo::internal::FixedBufferForTesting buf(size); |
280 internal::PodUnion_Data* data = nullptr; | 282 internal::PodUnion_Data* data = nullptr; |
281 mojo::internal::Serialize<PodUnionPtr>(pod, &buf, &data, false, nullptr); | 283 mojo::internal::Serialize<PodUnionPtr>(pod, &buf, &data, false, nullptr); |
282 | 284 |
283 void* raw_buf = buf.Leak(); | 285 void* raw_buf = buf.Leak(); |
284 mojo::internal::BoundsChecker bounds_checker(data, | 286 mojo::internal::ValidationContext validation_context( |
285 static_cast<uint32_t>(size), 0); | 287 data, static_cast<uint32_t>(size), 0); |
286 EXPECT_FALSE( | 288 EXPECT_FALSE( |
287 internal::PodUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 289 internal::PodUnion_Data::Validate(raw_buf, &validation_context, false)); |
288 free(raw_buf); | 290 free(raw_buf); |
289 } | 291 } |
290 | 292 |
291 TEST(UnionTest, UnknownExtensibleEnumValueValidation) { | 293 TEST(UnionTest, UnknownExtensibleEnumValueValidation) { |
292 PodUnionPtr pod(PodUnion::New()); | 294 PodUnionPtr pod(PodUnion::New()); |
293 pod->set_f_extensible_enum(static_cast<AnExtensibleEnum>(0xFFFF)); | 295 pod->set_f_extensible_enum(static_cast<AnExtensibleEnum>(0xFFFF)); |
294 | 296 |
295 size_t size = | 297 size_t size = |
296 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); | 298 mojo::internal::PrepareToSerialize<PodUnionPtr>(pod, false, nullptr); |
297 EXPECT_EQ(16U, size); | 299 EXPECT_EQ(16U, size); |
298 | 300 |
299 mojo::internal::FixedBufferForTesting buf(size); | 301 mojo::internal::FixedBufferForTesting buf(size); |
300 internal::PodUnion_Data* data = nullptr; | 302 internal::PodUnion_Data* data = nullptr; |
301 mojo::internal::Serialize<PodUnionPtr>(pod, &buf, &data, false, nullptr); | 303 mojo::internal::Serialize<PodUnionPtr>(pod, &buf, &data, false, nullptr); |
302 | 304 |
303 void* raw_buf = buf.Leak(); | 305 void* raw_buf = buf.Leak(); |
304 mojo::internal::BoundsChecker bounds_checker(data, | 306 mojo::internal::ValidationContext validation_context( |
305 static_cast<uint32_t>(size), 0); | 307 data, static_cast<uint32_t>(size), 0); |
306 EXPECT_TRUE( | 308 EXPECT_TRUE( |
307 internal::PodUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 309 internal::PodUnion_Data::Validate(raw_buf, &validation_context, false)); |
308 free(raw_buf); | 310 free(raw_buf); |
309 } | 311 } |
310 | 312 |
311 TEST(UnionTest, StringGetterSetter) { | 313 TEST(UnionTest, StringGetterSetter) { |
312 ObjectUnionPtr pod(ObjectUnion::New()); | 314 ObjectUnionPtr pod(ObjectUnion::New()); |
313 | 315 |
314 String hello("hello world"); | 316 String hello("hello world"); |
315 pod->set_f_string(hello); | 317 pod->set_f_string(hello); |
316 EXPECT_EQ(hello, pod->get_f_string()); | 318 EXPECT_EQ(hello, pod->get_f_string()); |
317 EXPECT_TRUE(pod->is_f_string()); | 319 EXPECT_TRUE(pod->is_f_string()); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 EXPECT_TRUE(pod2->is_f_string()); | 364 EXPECT_TRUE(pod2->is_f_string()); |
363 EXPECT_EQ(pod2->which(), ObjectUnion::Tag::F_STRING); | 365 EXPECT_EQ(pod2->which(), ObjectUnion::Tag::F_STRING); |
364 } | 366 } |
365 | 367 |
366 TEST(UnionTest, NullStringValidation) { | 368 TEST(UnionTest, NullStringValidation) { |
367 size_t size = sizeof(internal::ObjectUnion_Data); | 369 size_t size = sizeof(internal::ObjectUnion_Data); |
368 mojo::internal::FixedBufferForTesting buf(size); | 370 mojo::internal::FixedBufferForTesting buf(size); |
369 internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf); | 371 internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf); |
370 data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING; | 372 data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING; |
371 data->data.unknown = 0x0; | 373 data->data.unknown = 0x0; |
372 mojo::internal::BoundsChecker bounds_checker(data, | 374 mojo::internal::ValidationContext validation_context( |
373 static_cast<uint32_t>(size), 0); | 375 data, static_cast<uint32_t>(size), 0); |
374 void* raw_buf = buf.Leak(); | 376 void* raw_buf = buf.Leak(); |
375 EXPECT_FALSE( | 377 EXPECT_FALSE(internal::ObjectUnion_Data::Validate( |
376 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 378 raw_buf, &validation_context, false)); |
377 free(raw_buf); | 379 free(raw_buf); |
378 } | 380 } |
379 | 381 |
380 TEST(UnionTest, StringPointerOverflowValidation) { | 382 TEST(UnionTest, StringPointerOverflowValidation) { |
381 size_t size = sizeof(internal::ObjectUnion_Data); | 383 size_t size = sizeof(internal::ObjectUnion_Data); |
382 mojo::internal::FixedBufferForTesting buf(size); | 384 mojo::internal::FixedBufferForTesting buf(size); |
383 internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf); | 385 internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf); |
384 data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING; | 386 data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING; |
385 data->data.unknown = 0xFFFFFFFFFFFFFFFF; | 387 data->data.unknown = 0xFFFFFFFFFFFFFFFF; |
386 mojo::internal::BoundsChecker bounds_checker(data, | 388 mojo::internal::ValidationContext validation_context( |
387 static_cast<uint32_t>(size), 0); | 389 data, static_cast<uint32_t>(size), 0); |
388 void* raw_buf = buf.Leak(); | 390 void* raw_buf = buf.Leak(); |
389 EXPECT_FALSE( | 391 EXPECT_FALSE(internal::ObjectUnion_Data::Validate( |
390 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 392 raw_buf, &validation_context, false)); |
391 free(raw_buf); | 393 free(raw_buf); |
392 } | 394 } |
393 | 395 |
394 TEST(UnionTest, StringValidateOOB) { | 396 TEST(UnionTest, StringValidateOOB) { |
395 size_t size = 32; | 397 size_t size = 32; |
396 mojo::internal::FixedBufferForTesting buf(size); | 398 mojo::internal::FixedBufferForTesting buf(size); |
397 internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf); | 399 internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf); |
398 data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING; | 400 data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING; |
399 | 401 |
400 data->data.f_f_string.offset = 8; | 402 data->data.f_f_string.offset = 8; |
401 char* ptr = reinterpret_cast<char*>(&data->data.f_f_string); | 403 char* ptr = reinterpret_cast<char*>(&data->data.f_f_string); |
402 mojo::internal::ArrayHeader* array_header = | 404 mojo::internal::ArrayHeader* array_header = |
403 reinterpret_cast<mojo::internal::ArrayHeader*>(ptr + *ptr); | 405 reinterpret_cast<mojo::internal::ArrayHeader*>(ptr + *ptr); |
404 array_header->num_bytes = 20; // This should go out of bounds. | 406 array_header->num_bytes = 20; // This should go out of bounds. |
405 array_header->num_elements = 20; | 407 array_header->num_elements = 20; |
406 mojo::internal::BoundsChecker bounds_checker(data, 32, 0); | 408 mojo::internal::ValidationContext validation_context(data, 32, 0); |
407 void* raw_buf = buf.Leak(); | 409 void* raw_buf = buf.Leak(); |
408 EXPECT_FALSE( | 410 EXPECT_FALSE(internal::ObjectUnion_Data::Validate( |
409 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 411 raw_buf, &validation_context, false)); |
410 free(raw_buf); | 412 free(raw_buf); |
411 } | 413 } |
412 | 414 |
413 // TODO(azani): Move back in array_unittest.cc when possible. | 415 // TODO(azani): Move back in array_unittest.cc when possible. |
414 // Array tests | 416 // Array tests |
415 TEST(UnionTest, PodUnionInArray) { | 417 TEST(UnionTest, PodUnionInArray) { |
416 SmallStructPtr small_struct(SmallStruct::New()); | 418 SmallStructPtr small_struct(SmallStruct::New()); |
417 small_struct->pod_union_array = Array<PodUnionPtr>(2); | 419 small_struct->pod_union_array = Array<PodUnionPtr>(2); |
418 small_struct->pod_union_array[0] = PodUnion::New(); | 420 small_struct->pod_union_array[0] = PodUnion::New(); |
419 small_struct->pod_union_array[1] = PodUnion::New(); | 421 small_struct->pod_union_array[1] = PodUnion::New(); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 std::vector<char> new_buf; | 506 std::vector<char> new_buf; |
505 new_buf.resize(size); | 507 new_buf.resize(size); |
506 | 508 |
507 void* raw_buf = buf.Leak(); | 509 void* raw_buf = buf.Leak(); |
508 memcpy(new_buf.data(), raw_buf, size); | 510 memcpy(new_buf.data(), raw_buf, size); |
509 free(raw_buf); | 511 free(raw_buf); |
510 | 512 |
511 data = | 513 data = |
512 reinterpret_cast<mojo::internal::Array_Data<internal::ObjectUnion_Data>*>( | 514 reinterpret_cast<mojo::internal::Array_Data<internal::ObjectUnion_Data>*>( |
513 new_buf.data()); | 515 new_buf.data()); |
514 mojo::internal::BoundsChecker bounds_checker(data, | 516 mojo::internal::ValidationContext validation_context( |
515 static_cast<uint32_t>(size), 0); | 517 data, static_cast<uint32_t>(size), 0); |
516 ASSERT_TRUE(mojo::internal::Array_Data<internal::ObjectUnion_Data>::Validate( | 518 ASSERT_TRUE(mojo::internal::Array_Data<internal::ObjectUnion_Data>::Validate( |
517 data, &bounds_checker, &validate_params)); | 519 data, &validation_context, &validate_params)); |
518 | 520 |
519 data->DecodePointers(); | 521 data->DecodePointers(); |
520 Array<ObjectUnionPtr> array2; | 522 Array<ObjectUnionPtr> array2; |
521 mojo::internal::Deserialize<Array<ObjectUnionPtr>>(data, &array2, nullptr); | 523 mojo::internal::Deserialize<Array<ObjectUnionPtr>>(data, &array2, nullptr); |
522 | 524 |
523 EXPECT_EQ(2U, array2.size()); | 525 EXPECT_EQ(2U, array2.size()); |
524 | 526 |
525 EXPECT_EQ(String("hello"), array2[0]->get_f_string()); | 527 EXPECT_EQ(String("hello"), array2[0]->get_f_string()); |
526 EXPECT_EQ(String("world"), array2[1]->get_f_string()); | 528 EXPECT_EQ(String("world"), array2[1]->get_f_string()); |
527 } | 529 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 &context); | 595 &context); |
594 | 596 |
595 mojo::internal::FixedBufferForTesting buf(size); | 597 mojo::internal::FixedBufferForTesting buf(size); |
596 internal::SmallStruct_Data* data = nullptr; | 598 internal::SmallStruct_Data* data = nullptr; |
597 mojo::internal::Serialize<SmallStructPtr>(small_struct, &buf, &data, | 599 mojo::internal::Serialize<SmallStructPtr>(small_struct, &buf, &data, |
598 &context); | 600 &context); |
599 | 601 |
600 data->EncodePointers(); | 602 data->EncodePointers(); |
601 | 603 |
602 void* raw_buf = buf.Leak(); | 604 void* raw_buf = buf.Leak(); |
603 mojo::internal::BoundsChecker bounds_checker(data, | 605 mojo::internal::ValidationContext validation_context( |
604 static_cast<uint32_t>(size), 0); | 606 data, static_cast<uint32_t>(size), 0); |
605 EXPECT_TRUE(internal::SmallStruct_Data::Validate(raw_buf, &bounds_checker)); | 607 EXPECT_TRUE(internal::SmallStruct_Data::Validate( |
| 608 raw_buf, &validation_context)); |
606 free(raw_buf); | 609 free(raw_buf); |
607 } | 610 } |
608 | 611 |
609 // Validation test of a struct union fails due to unknown union tag. | 612 // Validation test of a struct union fails due to unknown union tag. |
610 TEST(UnionTest, Validation_PodUnionInStruct_Failure) { | 613 TEST(UnionTest, Validation_PodUnionInStruct_Failure) { |
611 SmallStructPtr small_struct(SmallStruct::New()); | 614 SmallStructPtr small_struct(SmallStruct::New()); |
612 small_struct->pod_union = PodUnion::New(); | 615 small_struct->pod_union = PodUnion::New(); |
613 small_struct->pod_union->set_f_int32(10); | 616 small_struct->pod_union->set_f_int32(10); |
614 | 617 |
615 mojo::internal::SerializationContext context; | 618 mojo::internal::SerializationContext context; |
616 size_t size = mojo::internal::PrepareToSerialize<SmallStructPtr>(small_struct, | 619 size_t size = mojo::internal::PrepareToSerialize<SmallStructPtr>(small_struct, |
617 &context); | 620 &context); |
618 | 621 |
619 mojo::internal::FixedBufferForTesting buf(size); | 622 mojo::internal::FixedBufferForTesting buf(size); |
620 internal::SmallStruct_Data* data = nullptr; | 623 internal::SmallStruct_Data* data = nullptr; |
621 mojo::internal::Serialize<SmallStructPtr>(small_struct, &buf, &data, | 624 mojo::internal::Serialize<SmallStructPtr>(small_struct, &buf, &data, |
622 &context); | 625 &context); |
623 data->pod_union.tag = static_cast<internal::PodUnion_Data::PodUnion_Tag>(100); | 626 data->pod_union.tag = static_cast<internal::PodUnion_Data::PodUnion_Tag>(100); |
624 | 627 |
625 data->EncodePointers(); | 628 data->EncodePointers(); |
626 | 629 |
627 void* raw_buf = buf.Leak(); | 630 void* raw_buf = buf.Leak(); |
628 mojo::internal::BoundsChecker bounds_checker(data, | 631 mojo::internal::ValidationContext validation_context( |
629 static_cast<uint32_t>(size), 0); | 632 data, static_cast<uint32_t>(size), 0); |
630 EXPECT_FALSE(internal::SmallStruct_Data::Validate(raw_buf, &bounds_checker)); | 633 EXPECT_FALSE(internal::SmallStruct_Data::Validate( |
| 634 raw_buf, &validation_context)); |
631 free(raw_buf); | 635 free(raw_buf); |
632 } | 636 } |
633 | 637 |
634 // Validation fails due to non-nullable null union in struct. | 638 // Validation fails due to non-nullable null union in struct. |
635 TEST(UnionTest, Validation_NullUnion_Failure) { | 639 TEST(UnionTest, Validation_NullUnion_Failure) { |
636 SmallStructNonNullableUnionPtr small_struct( | 640 SmallStructNonNullableUnionPtr small_struct( |
637 SmallStructNonNullableUnion::New()); | 641 SmallStructNonNullableUnion::New()); |
638 | 642 |
639 size_t size = | 643 size_t size = |
640 mojo::internal::PrepareToSerialize<SmallStructNonNullableUnionPtr>( | 644 mojo::internal::PrepareToSerialize<SmallStructNonNullableUnionPtr>( |
641 small_struct, nullptr); | 645 small_struct, nullptr); |
642 | 646 |
643 mojo::internal::FixedBufferForTesting buf(size); | 647 mojo::internal::FixedBufferForTesting buf(size); |
644 internal::SmallStructNonNullableUnion_Data* data = | 648 internal::SmallStructNonNullableUnion_Data* data = |
645 internal::SmallStructNonNullableUnion_Data::New(&buf); | 649 internal::SmallStructNonNullableUnion_Data::New(&buf); |
646 | 650 |
647 void* raw_buf = buf.Leak(); | 651 void* raw_buf = buf.Leak(); |
648 mojo::internal::BoundsChecker bounds_checker(data, | 652 mojo::internal::ValidationContext validation_context( |
649 static_cast<uint32_t>(size), 0); | 653 data, static_cast<uint32_t>(size), 0); |
650 EXPECT_FALSE(internal::SmallStructNonNullableUnion_Data::Validate( | 654 EXPECT_FALSE(internal::SmallStructNonNullableUnion_Data::Validate( |
651 raw_buf, &bounds_checker)); | 655 raw_buf, &validation_context)); |
652 free(raw_buf); | 656 free(raw_buf); |
653 } | 657 } |
654 | 658 |
655 // Validation passes with nullable null union. | 659 // Validation passes with nullable null union. |
656 TEST(UnionTest, Validation_NullableUnion) { | 660 TEST(UnionTest, Validation_NullableUnion) { |
657 SmallStructPtr small_struct(SmallStruct::New()); | 661 SmallStructPtr small_struct(SmallStruct::New()); |
658 | 662 |
659 mojo::internal::SerializationContext context; | 663 mojo::internal::SerializationContext context; |
660 size_t size = mojo::internal::PrepareToSerialize<SmallStructPtr>(small_struct, | 664 size_t size = mojo::internal::PrepareToSerialize<SmallStructPtr>(small_struct, |
661 &context); | 665 &context); |
662 | 666 |
663 mojo::internal::FixedBufferForTesting buf(size); | 667 mojo::internal::FixedBufferForTesting buf(size); |
664 internal::SmallStruct_Data* data = nullptr; | 668 internal::SmallStruct_Data* data = nullptr; |
665 mojo::internal::Serialize<SmallStructPtr>(small_struct, &buf, &data, | 669 mojo::internal::Serialize<SmallStructPtr>(small_struct, &buf, &data, |
666 &context); | 670 &context); |
667 | 671 |
668 data->EncodePointers(); | 672 data->EncodePointers(); |
669 | 673 |
670 void* raw_buf = buf.Leak(); | 674 void* raw_buf = buf.Leak(); |
671 mojo::internal::BoundsChecker bounds_checker(data, | 675 mojo::internal::ValidationContext validation_context( |
672 static_cast<uint32_t>(size), 0); | 676 data, static_cast<uint32_t>(size), 0); |
673 EXPECT_TRUE(internal::SmallStruct_Data::Validate(raw_buf, &bounds_checker)); | 677 EXPECT_TRUE(internal::SmallStruct_Data::Validate( |
| 678 raw_buf, &validation_context)); |
674 free(raw_buf); | 679 free(raw_buf); |
675 } | 680 } |
676 | 681 |
677 // TODO(azani): Move back in map_unittest.cc when possible. | 682 // TODO(azani): Move back in map_unittest.cc when possible. |
678 // Map Tests | 683 // Map Tests |
679 TEST(UnionTest, PodUnionInMap) { | 684 TEST(UnionTest, PodUnionInMap) { |
680 SmallStructPtr small_struct(SmallStruct::New()); | 685 SmallStructPtr small_struct(SmallStruct::New()); |
681 small_struct->pod_union_map = Map<String, PodUnionPtr>(); | 686 small_struct->pod_union_map = Map<String, PodUnionPtr>(); |
682 small_struct->pod_union_map.insert("one", PodUnion::New()); | 687 small_struct->pod_union_map.insert("one", PodUnion::New()); |
683 small_struct->pod_union_map.insert("two", PodUnion::New()); | 688 small_struct->pod_union_map.insert("two", PodUnion::New()); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 size_t size = | 794 size_t size = |
790 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); | 795 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); |
791 | 796 |
792 mojo::internal::FixedBufferForTesting buf(size); | 797 mojo::internal::FixedBufferForTesting buf(size); |
793 internal::ObjectUnion_Data* data = nullptr; | 798 internal::ObjectUnion_Data* data = nullptr; |
794 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); | 799 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); |
795 | 800 |
796 data->EncodePointers(); | 801 data->EncodePointers(); |
797 | 802 |
798 void* raw_buf = buf.Leak(); | 803 void* raw_buf = buf.Leak(); |
799 mojo::internal::BoundsChecker bounds_checker(data, | 804 mojo::internal::ValidationContext validation_context( |
800 static_cast<uint32_t>(size), 0); | 805 data, static_cast<uint32_t>(size), 0); |
801 EXPECT_TRUE( | 806 EXPECT_TRUE(internal::ObjectUnion_Data::Validate( |
802 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 807 raw_buf, &validation_context, false)); |
803 free(raw_buf); | 808 free(raw_buf); |
804 } | 809 } |
805 | 810 |
806 TEST(UnionTest, StructInUnionValidationNonNullable) { | 811 TEST(UnionTest, StructInUnionValidationNonNullable) { |
807 DummyStructPtr dummy(nullptr); | 812 DummyStructPtr dummy(nullptr); |
808 | 813 |
809 ObjectUnionPtr obj(ObjectUnion::New()); | 814 ObjectUnionPtr obj(ObjectUnion::New()); |
810 obj->set_f_dummy(std::move(dummy)); | 815 obj->set_f_dummy(std::move(dummy)); |
811 | 816 |
812 size_t size = | 817 size_t size = |
813 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); | 818 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); |
814 | 819 |
815 mojo::internal::FixedBufferForTesting buf(size); | 820 mojo::internal::FixedBufferForTesting buf(size); |
816 internal::ObjectUnion_Data* data = nullptr; | 821 internal::ObjectUnion_Data* data = nullptr; |
817 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); | 822 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); |
818 | 823 |
819 data->EncodePointers(); | 824 data->EncodePointers(); |
820 | 825 |
821 void* raw_buf = buf.Leak(); | 826 void* raw_buf = buf.Leak(); |
822 mojo::internal::BoundsChecker bounds_checker(data, | 827 mojo::internal::ValidationContext validation_context( |
823 static_cast<uint32_t>(size), 0); | 828 data, static_cast<uint32_t>(size), 0); |
824 EXPECT_FALSE( | 829 EXPECT_FALSE(internal::ObjectUnion_Data::Validate( |
825 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 830 raw_buf, &validation_context, false)); |
826 free(raw_buf); | 831 free(raw_buf); |
827 } | 832 } |
828 | 833 |
829 TEST(UnionTest, StructInUnionValidationNullable) { | 834 TEST(UnionTest, StructInUnionValidationNullable) { |
830 DummyStructPtr dummy(nullptr); | 835 DummyStructPtr dummy(nullptr); |
831 | 836 |
832 ObjectUnionPtr obj(ObjectUnion::New()); | 837 ObjectUnionPtr obj(ObjectUnion::New()); |
833 obj->set_f_nullable(std::move(dummy)); | 838 obj->set_f_nullable(std::move(dummy)); |
834 | 839 |
835 size_t size = | 840 size_t size = |
836 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); | 841 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); |
837 | 842 |
838 mojo::internal::FixedBufferForTesting buf(size); | 843 mojo::internal::FixedBufferForTesting buf(size); |
839 internal::ObjectUnion_Data* data = nullptr; | 844 internal::ObjectUnion_Data* data = nullptr; |
840 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); | 845 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); |
841 | 846 |
842 data->EncodePointers(); | 847 data->EncodePointers(); |
843 | 848 |
844 void* raw_buf = buf.Leak(); | 849 void* raw_buf = buf.Leak(); |
845 mojo::internal::BoundsChecker bounds_checker(data, | 850 mojo::internal::ValidationContext validation_context( |
846 static_cast<uint32_t>(size), 0); | 851 data, static_cast<uint32_t>(size), 0); |
847 EXPECT_TRUE( | 852 EXPECT_TRUE(internal::ObjectUnion_Data::Validate( |
848 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 853 raw_buf, &validation_context, false)); |
849 free(raw_buf); | 854 free(raw_buf); |
850 } | 855 } |
851 | 856 |
852 TEST(UnionTest, ArrayInUnionGetterSetter) { | 857 TEST(UnionTest, ArrayInUnionGetterSetter) { |
853 Array<int8_t> array(2); | 858 Array<int8_t> array(2); |
854 array[0] = 8; | 859 array[0] = 8; |
855 array[1] = 9; | 860 array[1] = 9; |
856 | 861 |
857 ObjectUnionPtr obj(ObjectUnion::New()); | 862 ObjectUnionPtr obj(ObjectUnion::New()); |
858 obj->set_f_array_int8(std::move(array)); | 863 obj->set_f_array_int8(std::move(array)); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 | 902 |
898 size_t size = | 903 size_t size = |
899 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); | 904 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); |
900 mojo::internal::FixedBufferForTesting buf(size); | 905 mojo::internal::FixedBufferForTesting buf(size); |
901 internal::ObjectUnion_Data* data = nullptr; | 906 internal::ObjectUnion_Data* data = nullptr; |
902 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); | 907 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); |
903 | 908 |
904 data->EncodePointers(); | 909 data->EncodePointers(); |
905 | 910 |
906 void* raw_buf = buf.Leak(); | 911 void* raw_buf = buf.Leak(); |
907 mojo::internal::BoundsChecker bounds_checker(data, | 912 mojo::internal::ValidationContext validation_context( |
908 static_cast<uint32_t>(size), 0); | 913 data, static_cast<uint32_t>(size), 0); |
909 | 914 |
910 EXPECT_TRUE( | 915 EXPECT_TRUE(internal::ObjectUnion_Data::Validate( |
911 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 916 raw_buf, &validation_context, false)); |
912 free(raw_buf); | 917 free(raw_buf); |
913 } | 918 } |
914 | 919 |
915 TEST(UnionTest, MapInUnionGetterSetter) { | 920 TEST(UnionTest, MapInUnionGetterSetter) { |
916 Map<String, int8_t> map; | 921 Map<String, int8_t> map; |
917 map.insert("one", 1); | 922 map.insert("one", 1); |
918 map.insert("two", 2); | 923 map.insert("two", 2); |
919 | 924 |
920 ObjectUnionPtr obj(ObjectUnion::New()); | 925 ObjectUnionPtr obj(ObjectUnion::New()); |
921 obj->set_f_map_int8(std::move(map)); | 926 obj->set_f_map_int8(std::move(map)); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, &context); | 969 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, &context); |
965 EXPECT_EQ(112U, size); | 970 EXPECT_EQ(112U, size); |
966 | 971 |
967 mojo::internal::FixedBufferForTesting buf(size); | 972 mojo::internal::FixedBufferForTesting buf(size); |
968 internal::ObjectUnion_Data* data = nullptr; | 973 internal::ObjectUnion_Data* data = nullptr; |
969 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, &context); | 974 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, &context); |
970 | 975 |
971 data->EncodePointers(); | 976 data->EncodePointers(); |
972 | 977 |
973 void* raw_buf = buf.Leak(); | 978 void* raw_buf = buf.Leak(); |
974 mojo::internal::BoundsChecker bounds_checker(data, | 979 mojo::internal::ValidationContext validation_context( |
975 static_cast<uint32_t>(size), 0); | 980 data, static_cast<uint32_t>(size), 0); |
976 | 981 |
977 EXPECT_TRUE( | 982 EXPECT_TRUE(internal::ObjectUnion_Data::Validate( |
978 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 983 raw_buf, &validation_context, false)); |
979 free(raw_buf); | 984 free(raw_buf); |
980 } | 985 } |
981 | 986 |
982 TEST(UnionTest, UnionInUnionGetterSetter) { | 987 TEST(UnionTest, UnionInUnionGetterSetter) { |
983 PodUnionPtr pod(PodUnion::New()); | 988 PodUnionPtr pod(PodUnion::New()); |
984 pod->set_f_int8(10); | 989 pod->set_f_int8(10); |
985 | 990 |
986 ObjectUnionPtr obj(ObjectUnion::New()); | 991 ObjectUnionPtr obj(ObjectUnion::New()); |
987 obj->set_f_pod_union(std::move(pod)); | 992 obj->set_f_pod_union(std::move(pod)); |
988 | 993 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1023 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); | 1028 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); |
1024 EXPECT_EQ(32U, size); | 1029 EXPECT_EQ(32U, size); |
1025 | 1030 |
1026 mojo::internal::FixedBufferForTesting buf(size); | 1031 mojo::internal::FixedBufferForTesting buf(size); |
1027 internal::ObjectUnion_Data* data = nullptr; | 1032 internal::ObjectUnion_Data* data = nullptr; |
1028 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); | 1033 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); |
1029 | 1034 |
1030 data->EncodePointers(); | 1035 data->EncodePointers(); |
1031 | 1036 |
1032 void* raw_buf = buf.Leak(); | 1037 void* raw_buf = buf.Leak(); |
1033 mojo::internal::BoundsChecker bounds_checker(data, | 1038 mojo::internal::ValidationContext validation_context( |
1034 static_cast<uint32_t>(size), 0); | 1039 data, static_cast<uint32_t>(size), 0); |
1035 EXPECT_TRUE( | 1040 EXPECT_TRUE(internal::ObjectUnion_Data::Validate( |
1036 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 1041 raw_buf, &validation_context, false)); |
1037 free(raw_buf); | 1042 free(raw_buf); |
1038 } | 1043 } |
1039 | 1044 |
1040 TEST(UnionTest, UnionInUnionValidationNonNullable) { | 1045 TEST(UnionTest, UnionInUnionValidationNonNullable) { |
1041 PodUnionPtr pod(nullptr); | 1046 PodUnionPtr pod(nullptr); |
1042 | 1047 |
1043 ObjectUnionPtr obj(ObjectUnion::New()); | 1048 ObjectUnionPtr obj(ObjectUnion::New()); |
1044 obj->set_f_pod_union(std::move(pod)); | 1049 obj->set_f_pod_union(std::move(pod)); |
1045 | 1050 |
1046 size_t size = | 1051 size_t size = |
1047 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); | 1052 mojo::internal::PrepareToSerialize<ObjectUnionPtr>(obj, false, nullptr); |
1048 | 1053 |
1049 mojo::internal::FixedBufferForTesting buf(size); | 1054 mojo::internal::FixedBufferForTesting buf(size); |
1050 internal::ObjectUnion_Data* data = nullptr; | 1055 internal::ObjectUnion_Data* data = nullptr; |
1051 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); | 1056 mojo::internal::Serialize<ObjectUnionPtr>(obj, &buf, &data, false, nullptr); |
1052 data->EncodePointers(); | 1057 data->EncodePointers(); |
1053 | 1058 |
1054 void* raw_buf = buf.Leak(); | 1059 void* raw_buf = buf.Leak(); |
1055 mojo::internal::BoundsChecker bounds_checker(data, | 1060 mojo::internal::ValidationContext validation_context( |
1056 static_cast<uint32_t>(size), 0); | 1061 data, static_cast<uint32_t>(size), 0); |
1057 EXPECT_FALSE( | 1062 EXPECT_FALSE(internal::ObjectUnion_Data::Validate( |
1058 internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 1063 raw_buf, &validation_context, false)); |
1059 free(raw_buf); | 1064 free(raw_buf); |
1060 } | 1065 } |
1061 | 1066 |
1062 TEST(UnionTest, HandleInUnionGetterSetter) { | 1067 TEST(UnionTest, HandleInUnionGetterSetter) { |
1063 ScopedMessagePipeHandle pipe0; | 1068 ScopedMessagePipeHandle pipe0; |
1064 ScopedMessagePipeHandle pipe1; | 1069 ScopedMessagePipeHandle pipe1; |
1065 | 1070 |
1066 CreateMessagePipe(nullptr, &pipe0, &pipe1); | 1071 CreateMessagePipe(nullptr, &pipe0, &pipe1); |
1067 | 1072 |
1068 HandleUnionPtr handle(HandleUnion::New()); | 1073 HandleUnionPtr handle(HandleUnion::New()); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1122 size_t size = mojo::internal::PrepareToSerialize<HandleUnionPtr>( | 1127 size_t size = mojo::internal::PrepareToSerialize<HandleUnionPtr>( |
1123 handle, false, &context); | 1128 handle, false, &context); |
1124 EXPECT_EQ(16U, size); | 1129 EXPECT_EQ(16U, size); |
1125 | 1130 |
1126 mojo::internal::FixedBufferForTesting buf(size); | 1131 mojo::internal::FixedBufferForTesting buf(size); |
1127 internal::HandleUnion_Data* data = nullptr; | 1132 internal::HandleUnion_Data* data = nullptr; |
1128 mojo::internal::Serialize<HandleUnionPtr>(handle, &buf, &data, false, | 1133 mojo::internal::Serialize<HandleUnionPtr>(handle, &buf, &data, false, |
1129 &context); | 1134 &context); |
1130 | 1135 |
1131 void* raw_buf = buf.Leak(); | 1136 void* raw_buf = buf.Leak(); |
1132 mojo::internal::BoundsChecker bounds_checker(data, | 1137 mojo::internal::ValidationContext validation_context( |
1133 static_cast<uint32_t>(size), 1); | 1138 data, static_cast<uint32_t>(size), 1); |
1134 EXPECT_TRUE( | 1139 EXPECT_TRUE(internal::HandleUnion_Data::Validate( |
1135 internal::HandleUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 1140 raw_buf, &validation_context, false)); |
1136 free(raw_buf); | 1141 free(raw_buf); |
1137 } | 1142 } |
1138 | 1143 |
1139 TEST(UnionTest, HandleInUnionValidationNull) { | 1144 TEST(UnionTest, HandleInUnionValidationNull) { |
1140 ScopedMessagePipeHandle pipe; | 1145 ScopedMessagePipeHandle pipe; |
1141 HandleUnionPtr handle(HandleUnion::New()); | 1146 HandleUnionPtr handle(HandleUnion::New()); |
1142 handle->set_f_message_pipe(std::move(pipe)); | 1147 handle->set_f_message_pipe(std::move(pipe)); |
1143 | 1148 |
1144 mojo::internal::SerializationContext context; | 1149 mojo::internal::SerializationContext context; |
1145 size_t size = mojo::internal::PrepareToSerialize<HandleUnionPtr>( | 1150 size_t size = mojo::internal::PrepareToSerialize<HandleUnionPtr>( |
1146 handle, false, &context); | 1151 handle, false, &context); |
1147 EXPECT_EQ(16U, size); | 1152 EXPECT_EQ(16U, size); |
1148 | 1153 |
1149 mojo::internal::FixedBufferForTesting buf(size); | 1154 mojo::internal::FixedBufferForTesting buf(size); |
1150 internal::HandleUnion_Data* data = nullptr; | 1155 internal::HandleUnion_Data* data = nullptr; |
1151 mojo::internal::Serialize<HandleUnionPtr>(handle, &buf, &data, false, | 1156 mojo::internal::Serialize<HandleUnionPtr>(handle, &buf, &data, false, |
1152 &context); | 1157 &context); |
1153 | 1158 |
1154 void* raw_buf = buf.Leak(); | 1159 void* raw_buf = buf.Leak(); |
1155 mojo::internal::BoundsChecker bounds_checker(data, | 1160 mojo::internal::ValidationContext validation_context( |
1156 static_cast<uint32_t>(size), 1); | 1161 data, static_cast<uint32_t>(size), 1); |
1157 EXPECT_FALSE( | 1162 EXPECT_FALSE(internal::HandleUnion_Data::Validate( |
1158 internal::HandleUnion_Data::Validate(raw_buf, &bounds_checker, false)); | 1163 raw_buf, &validation_context, false)); |
1159 free(raw_buf); | 1164 free(raw_buf); |
1160 } | 1165 } |
1161 | 1166 |
1162 class SmallCacheImpl : public SmallCache { | 1167 class SmallCacheImpl : public SmallCache { |
1163 public: | 1168 public: |
1164 explicit SmallCacheImpl(const base::Closure& closure) | 1169 explicit SmallCacheImpl(const base::Closure& closure) |
1165 : int_value_(0), closure_(closure) {} | 1170 : int_value_(0), closure_(closure) {} |
1166 ~SmallCacheImpl() override {} | 1171 ~SmallCacheImpl() override {} |
1167 int64_t int_value() const { return int_value_; } | 1172 int64_t int_value() const { return int_value_; } |
1168 | 1173 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 PodUnionPtr pod(PodUnion::New()); | 1247 PodUnionPtr pod(PodUnion::New()); |
1243 pod->set_f_int16(16); | 1248 pod->set_f_int16(16); |
1244 | 1249 |
1245 ptr->Echo(std::move(pod), | 1250 ptr->Echo(std::move(pod), |
1246 [](PodUnionPtr out) { EXPECT_EQ(16, out->get_f_int16()); }); | 1251 [](PodUnionPtr out) { EXPECT_EQ(16, out->get_f_int16()); }); |
1247 run_loop.RunUntilIdle(); | 1252 run_loop.RunUntilIdle(); |
1248 } | 1253 } |
1249 | 1254 |
1250 } // namespace test | 1255 } // namespace test |
1251 } // namespace mojo | 1256 } // namespace mojo |
OLD | NEW |