1// -*- c++ -*- 2// Protocol Buffers - Google's data interchange format 3// Copyright 2008 Google Inc. All rights reserved. 4// 5// Use of this source code is governed by a BSD-style 6// license that can be found in the LICENSE file or at 7// https://developers.google.com/open-source/licenses/bsd 8 9// Author: kenton@google.com (Kenton Varda) 10// Based on original Protocol Buffers design by 11// Sanjay Ghemawat, Jeff Dean, and others. 12 13#include <cstdint> 14#include <memory> 15#include <string> 16#include <vector> 17 18#include "google/protobuf/descriptor.pb.h" 19#include <gmock/gmock.h> 20#include "google/protobuf/testing/googletest.h" 21#include <gtest/gtest.h> 22#include "absl/base/casts.h" 23#include "absl/log/absl_check.h" 24#include "absl/log/scoped_mock_log.h" 25#include "absl/strings/cord.h" 26#include "absl/strings/match.h" 27#include "google/protobuf/descriptor.h" 28#include "google/protobuf/dynamic_message.h" 29#include "google/protobuf/generated_message_tctable_impl.h" 30#include "google/protobuf/io/coded_stream.h" 31#include "google/protobuf/io/zero_copy_stream_impl.h" 32#include "google/protobuf/io/zero_copy_stream_impl_lite.h" 33#include "google/protobuf/test_util2.h" 34#include "google/protobuf/wire_format.h" 35#include "google/protobuf/wire_format_lite.h" 36 37// clang-format off 38#include "google/protobuf/port_def.inc" 39// clang-format on 40 41namespace google { 42namespace protobuf { 43namespace internal { 44namespace { 45 46inline bool IsOptimizeForCodeSize(const Descriptor* descriptor) { 47 return descriptor->file()->options().optimize_for() == FileOptions::CODE_SIZE; 48} 49 50TEST(WireFormatTest, EnumsInSync) { 51 // Verify that WireFormatLite::FieldType and WireFormatLite::CppType match 52 // FieldDescriptor::Type and FieldDescriptor::CppType. 53 54 EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::MAX_TYPE), 55 absl::implicit_cast<int>(WireFormatLite::MAX_FIELD_TYPE)); 56 EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::MAX_CPPTYPE), 57 absl::implicit_cast<int>(WireFormatLite::MAX_CPPTYPE)); 58 59 for (int i = 1; i <= WireFormatLite::MAX_FIELD_TYPE; i++) { 60 EXPECT_EQ(absl::implicit_cast<int>(FieldDescriptor::TypeToCppType( 61 static_cast<FieldDescriptor::Type>(i))), 62 absl::implicit_cast<int>(WireFormatLite::FieldTypeToCppType( 63 static_cast<WireFormatLite::FieldType>(i)))); 64 } 65} 66 67TEST(WireFormatTest, MaxFieldNumber) { 68 // Make sure the max field number constant is accurate. 69 EXPECT_EQ((1 << (32 - WireFormatLite::kTagTypeBits)) - 1, 70 FieldDescriptor::kMaxNumber); 71} 72 73TEST(WireFormatTest, Parse) { 74 UNITTEST::TestAllTypes source, dest; 75 std::string data; 76 77 // Serialize using the generated code. 78 TestUtil::SetAllFields(&source); 79 source.SerializeToString(&data); 80 81 // Parse using WireFormat. 82 io::ArrayInputStream raw_input(data.data(), data.size()); 83 io::CodedInputStream input(&raw_input); 84 WireFormat::ParseAndMergePartial(&input, &dest); 85 86 // Check. 87 TestUtil::ExpectAllFieldsSet(dest); 88} 89 90TEST(WireFormatTest, ParseExtensions) { 91 UNITTEST::TestAllExtensions source, dest; 92 std::string data; 93 94 // Serialize using the generated code. 95 TestUtil::SetAllExtensions(&source); 96 source.SerializeToString(&data); 97 98 // Parse using WireFormat. 99 io::ArrayInputStream raw_input(data.data(), data.size()); 100 io::CodedInputStream input(&raw_input); 101 WireFormat::ParseAndMergePartial(&input, &dest); 102 103 // Check. 104 TestUtil::ExpectAllExtensionsSet(dest); 105} 106 107TEST(WireFormatTest, ParsePacked) { 108 UNITTEST::TestPackedTypes source, dest; 109 std::string data; 110 111 // Serialize using the generated code. 112 TestUtil::SetPackedFields(&source); 113 source.SerializeToString(&data); 114 115 // Parse using WireFormat. 116 io::ArrayInputStream raw_input(data.data(), data.size()); 117 io::CodedInputStream input(&raw_input); 118 WireFormat::ParseAndMergePartial(&input, &dest); 119 120 // Check. 121 TestUtil::ExpectPackedFieldsSet(dest); 122} 123 124TEST(WireFormatTest, ParsePackedFromUnpacked) { 125 // Serialize using the generated code. 126 UNITTEST::TestUnpackedTypes source; 127 TestUtil::SetUnpackedFields(&source); 128 std::string data = source.SerializeAsString(); 129 130 // Parse using WireFormat. 131 UNITTEST::TestPackedTypes dest; 132 io::ArrayInputStream raw_input(data.data(), data.size()); 133 io::CodedInputStream input(&raw_input); 134 WireFormat::ParseAndMergePartial(&input, &dest); 135 136 // Check. 137 TestUtil::ExpectPackedFieldsSet(dest); 138} 139 140TEST(WireFormatTest, ParseUnpackedFromPacked) { 141 // Serialize using the generated code. 142 UNITTEST::TestPackedTypes source; 143 TestUtil::SetPackedFields(&source); 144 std::string data = source.SerializeAsString(); 145 146 // Parse using WireFormat. 147 UNITTEST::TestUnpackedTypes dest; 148 io::ArrayInputStream raw_input(data.data(), data.size()); 149 io::CodedInputStream input(&raw_input); 150 WireFormat::ParseAndMergePartial(&input, &dest); 151 152 // Check. 153 TestUtil::ExpectUnpackedFieldsSet(dest); 154} 155 156TEST(WireFormatTest, ParsePackedExtensions) { 157 UNITTEST::TestPackedExtensions source, dest; 158 std::string data; 159 160 // Serialize using the generated code. 161 TestUtil::SetPackedExtensions(&source); 162 source.SerializeToString(&data); 163 164 // Parse using WireFormat. 165 io::ArrayInputStream raw_input(data.data(), data.size()); 166 io::CodedInputStream input(&raw_input); 167 WireFormat::ParseAndMergePartial(&input, &dest); 168 169 // Check. 170 TestUtil::ExpectPackedExtensionsSet(dest); 171} 172 173TEST(WireFormatTest, ParseOneof) { 174 UNITTEST::TestOneof2 source, dest; 175 std::string data; 176 177 // Serialize using the generated code. 178 TestUtil::SetOneof1(&source); 179 source.SerializeToString(&data); 180 181 // Parse using WireFormat. 182 io::ArrayInputStream raw_input(data.data(), data.size()); 183 io::CodedInputStream input(&raw_input); 184 WireFormat::ParseAndMergePartial(&input, &dest); 185 186 // Check. 187 TestUtil::ExpectOneofSet1(dest); 188} 189 190TEST(WireFormatTest, OneofOnlySetLast) { 191 UNITTEST::TestOneofBackwardsCompatible source; 192 UNITTEST::TestOneof oneof_dest; 193 std::string data; 194 195 // Set two fields 196 source.set_foo_int(100); 197 source.set_foo_string("101"); 198 199 // Serialize and parse to oneof message. Generated serializer may not order 200 // fields in tag order. Use WireFormat::SerializeWithCachedSizes instead as 201 // it sorts fields beforehand. 202 { 203 io::StringOutputStream raw_output(&data); 204 io::CodedOutputStream output(&raw_output); 205 WireFormat::SerializeWithCachedSizes(source, source.ByteSizeLong(), 206 &output); 207 ASSERT_FALSE(output.HadError()); 208 } 209 io::ArrayInputStream raw_input(data.data(), data.size()); 210 io::CodedInputStream input(&raw_input); 211 WireFormat::ParseAndMergePartial(&input, &oneof_dest); 212 213 // Only the last field is set. 214 EXPECT_FALSE(oneof_dest.has_foo_int()); 215 EXPECT_TRUE(oneof_dest.has_foo_string()); 216} 217 218TEST(WireFormatTest, ByteSize) { 219 UNITTEST::TestAllTypes message; 220 TestUtil::SetAllFields(&message); 221 222 EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message)); 223 message.Clear(); 224 EXPECT_EQ(0, message.ByteSizeLong()); 225 EXPECT_EQ(0, WireFormat::ByteSize(message)); 226} 227 228TEST(WireFormatTest, ByteSizeExtensions) { 229 UNITTEST::TestAllExtensions message; 230 TestUtil::SetAllExtensions(&message); 231 232 EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message)); 233 message.Clear(); 234 EXPECT_EQ(0, message.ByteSizeLong()); 235 EXPECT_EQ(0, WireFormat::ByteSize(message)); 236} 237 238TEST(WireFormatTest, ByteSizePacked) { 239 UNITTEST::TestPackedTypes message; 240 TestUtil::SetPackedFields(&message); 241 242 EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message)); 243 message.Clear(); 244 EXPECT_EQ(0, message.ByteSizeLong()); 245 EXPECT_EQ(0, WireFormat::ByteSize(message)); 246} 247 248TEST(WireFormatTest, ByteSizePackedExtensions) { 249 UNITTEST::TestPackedExtensions message; 250 TestUtil::SetPackedExtensions(&message); 251 252 EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message)); 253 message.Clear(); 254 EXPECT_EQ(0, message.ByteSizeLong()); 255 EXPECT_EQ(0, WireFormat::ByteSize(message)); 256} 257 258TEST(WireFormatTest, ByteSizeOneof) { 259 UNITTEST::TestOneof2 message; 260 TestUtil::SetOneof1(&message); 261 262 EXPECT_EQ(message.ByteSizeLong(), WireFormat::ByteSize(message)); 263 message.Clear(); 264 265 EXPECT_EQ(0, message.ByteSizeLong()); 266 EXPECT_EQ(0, WireFormat::ByteSize(message)); 267} 268 269TEST(WireFormatTest, Serialize) { 270 UNITTEST::TestAllTypes message; 271 std::string generated_data; 272 std::string dynamic_data; 273 274 TestUtil::SetAllFields(&message); 275 size_t size = message.ByteSizeLong(); 276 277 // Serialize using the generated code. 278 { 279 io::StringOutputStream raw_output(&generated_data); 280 io::CodedOutputStream output(&raw_output); 281 message.SerializeWithCachedSizes(&output); 282 ASSERT_FALSE(output.HadError()); 283 } 284 285 // Serialize using WireFormat. 286 { 287 io::StringOutputStream raw_output(&dynamic_data); 288 io::CodedOutputStream output(&raw_output); 289 WireFormat::SerializeWithCachedSizes(message, size, &output); 290 ASSERT_FALSE(output.HadError()); 291 } 292 293 // Should parse to the same message. 294 EXPECT_TRUE(TestUtil::EqualsToSerialized(message, generated_data)); 295 EXPECT_TRUE(TestUtil::EqualsToSerialized(message, dynamic_data)); 296} 297 298TEST(WireFormatTest, SerializeExtensions) { 299 UNITTEST::TestAllExtensions message; 300 std::string generated_data; 301 std::string dynamic_data; 302 303 TestUtil::SetAllExtensions(&message); 304 size_t size = message.ByteSizeLong(); 305 306 // Serialize using the generated code. 307 { 308 io::StringOutputStream raw_output(&generated_data); 309 io::CodedOutputStream output(&raw_output); 310 message.SerializeWithCachedSizes(&output); 311 ASSERT_FALSE(output.HadError()); 312 } 313 314 // Serialize using WireFormat. 315 { 316 io::StringOutputStream raw_output(&dynamic_data); 317 io::CodedOutputStream output(&raw_output); 318 WireFormat::SerializeWithCachedSizes(message, size, &output); 319 ASSERT_FALSE(output.HadError()); 320 } 321 322 // Should parse to the same message. 323 EXPECT_TRUE(TestUtil::EqualsToSerialized(message, generated_data)); 324 EXPECT_TRUE(TestUtil::EqualsToSerialized(message, dynamic_data)); 325} 326 327TEST(WireFormatTest, SerializeFieldsAndExtensions) { 328 UNITTEST::TestFieldOrderings message; 329 std::string generated_data; 330 std::string dynamic_data; 331 332 TestUtil::SetAllFieldsAndExtensions(&message); 333 size_t size = message.ByteSizeLong(); 334 335 // Serialize using the generated code. 336 { 337 io::StringOutputStream raw_output(&generated_data); 338 io::CodedOutputStream output(&raw_output); 339 message.SerializeWithCachedSizes(&output); 340 ASSERT_FALSE(output.HadError()); 341 } 342 343 // Serialize using WireFormat. 344 { 345 io::StringOutputStream raw_output(&dynamic_data); 346 io::CodedOutputStream output(&raw_output); 347 WireFormat::SerializeWithCachedSizes(message, size, &output); 348 ASSERT_FALSE(output.HadError()); 349 } 350 351 // Should parse to the same message. 352 EXPECT_TRUE(TestUtil::EqualsToSerialized(message, generated_data)); 353 EXPECT_TRUE(TestUtil::EqualsToSerialized(message, dynamic_data)); 354} 355 356TEST(WireFormatTest, SerializeOneof) { 357 UNITTEST::TestOneof2 message; 358 std::string generated_data; 359 std::string dynamic_data; 360 361 TestUtil::SetOneof1(&message); 362 size_t size = message.ByteSizeLong(); 363 364 // Serialize using the generated code. 365 { 366 io::StringOutputStream raw_output(&generated_data); 367 io::CodedOutputStream output(&raw_output); 368 message.SerializeWithCachedSizes(&output); 369 ASSERT_FALSE(output.HadError()); 370 } 371 372 // Serialize using WireFormat. 373 { 374 io::StringOutputStream raw_output(&dynamic_data); 375 io::CodedOutputStream output(&raw_output); 376 WireFormat::SerializeWithCachedSizes(message, size, &output); 377 ASSERT_FALSE(output.HadError()); 378 } 379 380 // Should parse to the same message. 381 EXPECT_TRUE(TestUtil::EqualsToSerialized(message, generated_data)); 382 EXPECT_TRUE(TestUtil::EqualsToSerialized(message, dynamic_data)); 383} 384 385TEST(WireFormatTest, ParseMultipleExtensionRanges) { 386 // Make sure we can parse a message that contains multiple extensions ranges. 387 UNITTEST::TestFieldOrderings source; 388 std::string data; 389 390 TestUtil::SetAllFieldsAndExtensions(&source); 391 source.SerializeToString(&data); 392 393 { 394 UNITTEST::TestFieldOrderings dest; 395 EXPECT_TRUE(dest.ParseFromString(data)); 396 EXPECT_EQ(source.DebugString(), dest.DebugString()); 397 } 398 399 // Also test using reflection-based parsing. 400 { 401 UNITTEST::TestFieldOrderings dest; 402 io::ArrayInputStream raw_input(data.data(), data.size()); 403 io::CodedInputStream coded_input(&raw_input); 404 EXPECT_TRUE(WireFormat::ParseAndMergePartial(&coded_input, &dest)); 405 EXPECT_EQ(source.DebugString(), dest.DebugString()); 406 } 407} 408 409const int kUnknownTypeId = 1550055; 410 411TEST(WireFormatTest, SerializeMessageSet) { 412 // Set up a TestMessageSet with two known messages and an unknown one. 413 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 414 message_set 415 .MutableExtension( 416 UNITTEST::TestMessageSetExtension1::message_set_extension) 417 ->set_i(123); 418 message_set 419 .MutableExtension( 420 UNITTEST::TestMessageSetExtension2::message_set_extension) 421 ->set_str("foo"); 422 message_set.mutable_unknown_fields()->AddLengthDelimited(kUnknownTypeId, 423 "bar"); 424 425 std::string data; 426 ASSERT_TRUE(message_set.SerializeToString(&data)); 427 428 // Parse back using RawMessageSet and check the contents. 429 UNITTEST::RawMessageSet raw; 430 ASSERT_TRUE(raw.ParseFromString(data)); 431 432 EXPECT_EQ(0, raw.unknown_fields().field_count()); 433 434 ASSERT_EQ(3, raw.item_size()); 435 EXPECT_EQ( 436 UNITTEST::TestMessageSetExtension1::descriptor()->extension(0)->number(), 437 raw.item(0).type_id()); 438 EXPECT_EQ( 439 UNITTEST::TestMessageSetExtension2::descriptor()->extension(0)->number(), 440 raw.item(1).type_id()); 441 EXPECT_EQ(kUnknownTypeId, raw.item(2).type_id()); 442 443 UNITTEST::TestMessageSetExtension1 message1; 444 EXPECT_TRUE(message1.ParseFromString(raw.item(0).message())); 445 EXPECT_EQ(123, message1.i()); 446 447 UNITTEST::TestMessageSetExtension2 message2; 448 EXPECT_TRUE(message2.ParseFromString(raw.item(1).message())); 449 EXPECT_EQ("foo", message2.str()); 450 451 EXPECT_EQ("bar", raw.item(2).message()); 452} 453 454TEST(WireFormatTest, SerializeMessageSetVariousWaysAreEqual) { 455 // Serialize a MessageSet to a stream and to a flat array using generated 456 // code, and also using WireFormat, and check that the results are equal. 457 // Set up a TestMessageSet with two known messages and an unknown one, as 458 // above. 459 460 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 461 message_set 462 .MutableExtension( 463 UNITTEST::TestMessageSetExtension1::message_set_extension) 464 ->set_i(123); 465 message_set 466 .MutableExtension( 467 UNITTEST::TestMessageSetExtension2::message_set_extension) 468 ->set_str("foo"); 469 message_set.mutable_unknown_fields()->AddLengthDelimited(kUnknownTypeId, 470 "bar"); 471 472 size_t size = message_set.ByteSizeLong(); 473 EXPECT_EQ(size, message_set.GetCachedSize()); 474 ASSERT_EQ(size, WireFormat::ByteSize(message_set)); 475 476 std::string flat_data; 477 std::string stream_data; 478 std::string dynamic_data; 479 flat_data.resize(size); 480 stream_data.resize(size); 481 482 // Serialize to flat array 483 { 484 uint8_t* target = reinterpret_cast<uint8_t*>(&flat_data[0]); 485 uint8_t* end = message_set.SerializeWithCachedSizesToArray(target); 486 EXPECT_EQ(size, end - target); 487 } 488 489 // Serialize to buffer 490 { 491 io::ArrayOutputStream array_stream(&stream_data[0], size, 1); 492 io::CodedOutputStream output_stream(&array_stream); 493 message_set.SerializeWithCachedSizes(&output_stream); 494 ASSERT_FALSE(output_stream.HadError()); 495 } 496 497 // Serialize to buffer with WireFormat. 498 { 499 io::StringOutputStream string_stream(&dynamic_data); 500 io::CodedOutputStream output_stream(&string_stream); 501 WireFormat::SerializeWithCachedSizes(message_set, size, &output_stream); 502 ASSERT_FALSE(output_stream.HadError()); 503 } 504 505 EXPECT_TRUE(flat_data == stream_data); 506 EXPECT_TRUE(flat_data == dynamic_data); 507} 508 509TEST(WireFormatTest, ParseMessageSet) { 510 // Set up a RawMessageSet with two known messages and an unknown one. 511 UNITTEST::RawMessageSet raw; 512 513 { 514 UNITTEST::RawMessageSet::Item* item = raw.add_item(); 515 item->set_type_id(UNITTEST::TestMessageSetExtension1::descriptor() 516 ->extension(0) 517 ->number()); 518 UNITTEST::TestMessageSetExtension1 message; 519 message.set_i(123); 520 message.SerializeToString(item->mutable_message()); 521 } 522 523 { 524 UNITTEST::RawMessageSet::Item* item = raw.add_item(); 525 item->set_type_id(UNITTEST::TestMessageSetExtension2::descriptor() 526 ->extension(0) 527 ->number()); 528 UNITTEST::TestMessageSetExtension2 message; 529 message.set_str("foo"); 530 message.SerializeToString(item->mutable_message()); 531 } 532 533 { 534 UNITTEST::RawMessageSet::Item* item = raw.add_item(); 535 item->set_type_id(kUnknownTypeId); 536 item->set_message("bar"); 537 } 538 539 std::string data; 540 ASSERT_TRUE(raw.SerializeToString(&data)); 541 542 // Parse as a TestMessageSet and check the contents. 543 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 544 ASSERT_TRUE(message_set.ParseFromString(data)); 545 546 EXPECT_EQ(123, 547 message_set 548 .GetExtension( 549 UNITTEST::TestMessageSetExtension1::message_set_extension) 550 .i()); 551 EXPECT_EQ("foo", 552 message_set 553 .GetExtension( 554 UNITTEST::TestMessageSetExtension2::message_set_extension) 555 .str()); 556 557 ASSERT_EQ(1, message_set.unknown_fields().field_count()); 558 ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED, 559 message_set.unknown_fields().field(0).type()); 560 EXPECT_EQ("bar", message_set.unknown_fields().field(0).length_delimited()); 561 562 // Also parse using WireFormat. 563 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet dynamic_message_set; 564 io::CodedInputStream input(reinterpret_cast<const uint8_t*>(data.data()), 565 data.size()); 566 ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &dynamic_message_set)); 567 EXPECT_EQ(message_set.DebugString(), dynamic_message_set.DebugString()); 568} 569 570TEST(WireFormatTest, MessageSetUnknownButValidTypeId) { 571 const char encoded[] = { 572 013, // 1: SGROUP 573 032, 2, // 3:LEN 2 574 010, 0, // 1:0 575 020, 4, // 2:4 576 014 // 1: EGROUP 577 }; 578 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message; 579 EXPECT_TRUE(message.ParseFromArray(encoded, sizeof(encoded))); 580} 581 582TEST(WireFormatTest, MessageSetInvalidTypeId) { 583 // "type_id" is 0 and should fail to parse. 584 const char encoded[] = { 585 013, // 1: SGROUP 586 032, 2, // 3:LEN 2 587 010, 0, // 1:0 588 020, 0, // 2:0 589 014 // 1: EGROUP 590 }; 591 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message; 592 EXPECT_FALSE(message.ParseFromArray(encoded, sizeof(encoded))); 593} 594 595TEST(WireFormatTest, MessageSetNonCanonInvalidTypeId) { 596 // "type_id" is 0 and should fail to parse. uint8_t is used to silence 597 // complaints about narrowing conversion. 598 const uint8_t encoded[] = { 599 013, // 1: SGROUP 600 032, 0, // 3:LEN 0 601 020, 0x80, 0x80, 0x80, 0x80, 020, // 2: long-form:2 0 602 014 // 1: EGROUP 603 }; 604 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message; 605 EXPECT_FALSE(message.ParseFromArray(encoded, sizeof(encoded))); 606} 607 608namespace { 609std::string BuildMessageSetItemStart() { 610 std::string data; 611 { 612 io::StringOutputStream output_stream(&data); 613 io::CodedOutputStream coded_output(&output_stream); 614 coded_output.WriteTag(WireFormatLite::kMessageSetItemStartTag); 615 } 616 return data; 617} 618std::string BuildMessageSetItemEnd() { 619 std::string data; 620 { 621 io::StringOutputStream output_stream(&data); 622 io::CodedOutputStream coded_output(&output_stream); 623 coded_output.WriteTag(WireFormatLite::kMessageSetItemEndTag); 624 } 625 return data; 626} 627std::string BuildMessageSetTestExtension1(int value = 123) { 628 std::string data; 629 { 630 UNITTEST::TestMessageSetExtension1 message; 631 message.set_i(value); 632 io::StringOutputStream output_stream(&data); 633 io::CodedOutputStream coded_output(&output_stream); 634 // Write the message content first. 635 WireFormatLite::WriteTag(WireFormatLite::kMessageSetMessageNumber, 636 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, 637 &coded_output); 638 coded_output.WriteVarint32(message.ByteSizeLong()); 639 message.SerializeWithCachedSizes(&coded_output); 640 } 641 return data; 642} 643std::string BuildMessageSetItemTypeId(int extension_number) { 644 std::string data; 645 { 646 io::StringOutputStream output_stream(&data); 647 io::CodedOutputStream coded_output(&output_stream); 648 WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, 649 extension_number, &coded_output); 650 } 651 return data; 652} 653void ValidateTestMessageSet(const std::string& test_case, 654 const std::string& data) { 655 SCOPED_TRACE(test_case); 656 { 657 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 658 ASSERT_TRUE(message_set.ParseFromString(data)); 659 660 EXPECT_EQ(123, 661 message_set 662 .GetExtension( 663 UNITTEST::TestMessageSetExtension1::message_set_extension) 664 .i()); 665 666 // Make sure it does not contain anything else. 667 message_set.ClearExtension( 668 UNITTEST::TestMessageSetExtension1::message_set_extension); 669 EXPECT_EQ(message_set.SerializeAsString(), ""); 670 } 671 { 672 // Test parse the message via Reflection. 673 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 674 io::CodedInputStream input(reinterpret_cast<const uint8_t*>(data.data()), 675 data.size()); 676 EXPECT_TRUE(WireFormat::ParseAndMergePartial(&input, &message_set)); 677 EXPECT_TRUE(input.ConsumedEntireMessage()); 678 679 EXPECT_EQ(123, 680 message_set 681 .GetExtension( 682 UNITTEST::TestMessageSetExtension1::message_set_extension) 683 .i()); 684 } 685 { 686 // Test parse the message via DynamicMessage. 687 DynamicMessageFactory factory; 688 std::unique_ptr<Message> msg( 689 factory 690 .GetPrototype( 691 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet::descriptor()) 692 ->New()); 693 msg->ParseFromString(data); 694 auto* reflection = msg->GetReflection(); 695 std::vector<const FieldDescriptor*> fields; 696 reflection->ListFields(*msg, &fields); 697 ASSERT_EQ(fields.size(), 1); 698 const auto& sub = reflection->GetMessage(*msg, fields[0]); 699 reflection = sub.GetReflection(); 700 EXPECT_EQ(123, reflection->GetInt32( 701 sub, sub.GetDescriptor()->FindFieldByName("i"))); 702 } 703} 704} // namespace 705 706TEST(WireFormatTest, ParseMessageSetWithAnyTagOrder) { 707 std::string start = BuildMessageSetItemStart(); 708 std::string end = BuildMessageSetItemEnd(); 709 std::string id = BuildMessageSetItemTypeId( 710 UNITTEST::TestMessageSetExtension1::descriptor()->extension(0)->number()); 711 std::string message = BuildMessageSetTestExtension1(); 712 713 ValidateTestMessageSet("id + message", start + id + message + end); 714 ValidateTestMessageSet("message + id", start + message + id + end); 715} 716 717TEST(WireFormatTest, ParseMessageSetWithDuplicateTags) { 718 std::string start = BuildMessageSetItemStart(); 719 std::string end = BuildMessageSetItemEnd(); 720 std::string id = BuildMessageSetItemTypeId( 721 UNITTEST::TestMessageSetExtension1::descriptor()->extension(0)->number()); 722 std::string other_id = BuildMessageSetItemTypeId(123456); 723 std::string message = BuildMessageSetTestExtension1(); 724 std::string other_message = BuildMessageSetTestExtension1(321); 725 726 // Double id 727 ValidateTestMessageSet("id + other_id + message", 728 start + id + other_id + message + end); 729 ValidateTestMessageSet("id + message + other_id", 730 start + id + message + other_id + end); 731 ValidateTestMessageSet("message + id + other_id", 732 start + message + id + other_id + end); 733 // Double message 734 ValidateTestMessageSet("id + message + other_message", 735 start + id + message + other_message + end); 736 ValidateTestMessageSet("message + id + other_message", 737 start + message + id + other_message + end); 738 ValidateTestMessageSet("message + other_message + id", 739 start + message + other_message + id + end); 740} 741 742void SerializeReverseOrder( 743 const PROTO2_WIREFORMAT_UNITTEST::TestMessageSet& mset, 744 io::CodedOutputStream* coded_output); 745 746void SerializeReverseOrder(const UNITTEST::TestMessageSetExtension1& message, 747 io::CodedOutputStream* coded_output) { 748 WireFormatLite::WriteTag(15, // i 749 WireFormatLite::WIRETYPE_VARINT, coded_output); 750 coded_output->WriteVarint64(message.i()); 751 WireFormatLite::WriteTag(16, // recursive 752 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, 753 coded_output); 754 coded_output->WriteVarint32(message.recursive().GetCachedSize()); 755 SerializeReverseOrder(message.recursive(), coded_output); 756} 757 758void SerializeReverseOrder( 759 const PROTO2_WIREFORMAT_UNITTEST::TestMessageSet& mset, 760 io::CodedOutputStream* coded_output) { 761 if (!mset.HasExtension( 762 UNITTEST::TestMessageSetExtension1::message_set_extension)) 763 return; 764 coded_output->WriteTag(WireFormatLite::kMessageSetItemStartTag); 765 // Write the message content first. 766 WireFormatLite::WriteTag(WireFormatLite::kMessageSetMessageNumber, 767 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, 768 coded_output); 769 auto& message = mset.GetExtension( 770 UNITTEST::TestMessageSetExtension1::message_set_extension); 771 coded_output->WriteVarint32(message.GetCachedSize()); 772 SerializeReverseOrder(message, coded_output); 773 // Write the type id. 774 uint32_t type_id = message.GetDescriptor()->extension(0)->number(); 775 WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, type_id, 776 coded_output); 777 coded_output->WriteTag(WireFormatLite::kMessageSetItemEndTag); 778} 779 780TEST(WireFormatTest, ParseMessageSetWithDeepRecReverseOrder) { 781 std::string data; 782 { 783 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 784 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet* mset = &message_set; 785 for (int i = 0; i < 200; i++) { 786 auto m = mset->MutableExtension( 787 UNITTEST::TestMessageSetExtension1::message_set_extension); 788 m->set_i(i); 789 mset = m->mutable_recursive(); 790 } 791 message_set.ByteSizeLong(); 792 // Serialize with reverse payload tag order 793 io::StringOutputStream output_stream(&data); 794 io::CodedOutputStream coded_output(&output_stream); 795 SerializeReverseOrder(message_set, &coded_output); 796 } 797 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 798 EXPECT_FALSE(message_set.ParseFromString(data)); 799} 800 801TEST(WireFormatTest, ParseFailMalformedMessageSet) { 802 constexpr int kDepth = 5; 803 std::string data; 804 { 805 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 806 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet* mset = &message_set; 807 for (int i = 0; i < kDepth; i++) { 808 auto m = mset->MutableExtension( 809 UNITTEST::TestMessageSetExtension1::message_set_extension); 810 m->set_i(i); 811 mset = m->mutable_recursive(); 812 } 813 auto m = mset->MutableExtension( 814 UNITTEST::TestMessageSetExtension1::message_set_extension); 815 // -1 becomes \xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1 816 m->set_i(-1); 817 818 EXPECT_TRUE(message_set.SerializeToString(&data)); 819 // Make the proto mal-formed. 820 data[data.size() - 2 - kDepth] = 0xFF; 821 } 822 823 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 824 EXPECT_FALSE(message_set.ParseFromString(data)); 825} 826 827TEST(WireFormatTest, ParseFailMalformedMessageSetReverseOrder) { 828 constexpr int kDepth = 5; 829 std::string data; 830 { 831 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 832 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet* mset = &message_set; 833 for (int i = 0; i < kDepth; i++) { 834 auto m = mset->MutableExtension( 835 UNITTEST::TestMessageSetExtension1::message_set_extension); 836 m->set_i(i); 837 mset = m->mutable_recursive(); 838 } 839 auto m = mset->MutableExtension( 840 UNITTEST::TestMessageSetExtension1::message_set_extension); 841 // -1 becomes \xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1 842 m->set_i(-1); 843 // SerializeReverseOrder() assumes "recursive" is always present. 844 m->mutable_recursive(); 845 846 message_set.ByteSizeLong(); 847 848 // Serialize with reverse payload tag order 849 io::StringOutputStream output_stream(&data); 850 io::CodedOutputStream coded_output(&output_stream); 851 SerializeReverseOrder(message_set, &coded_output); 852 } 853 854 // Make varint for -1 malformed. 855 data[data.size() - 5 * (kDepth + 1) - 4] = 0xFF; 856 857 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 858 EXPECT_FALSE(message_set.ParseFromString(data)); 859} 860 861TEST(WireFormatTest, ParseBrokenMessageSet) { 862 PROTO2_WIREFORMAT_UNITTEST::TestMessageSet message_set; 863 std::string input("goodbye"); // Invalid wire format data. 864 EXPECT_FALSE(message_set.ParseFromString(input)); 865} 866 867TEST(WireFormatTest, RecursionLimit) { 868 UNITTEST::TestRecursiveMessage message; 869 message.mutable_a()->mutable_a()->mutable_a()->mutable_a()->set_i(1); 870 std::string data; 871 message.SerializeToString(&data); 872 873 { 874 io::ArrayInputStream raw_input(data.data(), data.size()); 875 io::CodedInputStream input(&raw_input); 876 input.SetRecursionLimit(4); 877 UNITTEST::TestRecursiveMessage message2; 878 EXPECT_TRUE(message2.ParseFromCodedStream(&input)); 879 } 880 881 { 882 io::ArrayInputStream raw_input(data.data(), data.size()); 883 io::CodedInputStream input(&raw_input); 884 input.SetRecursionLimit(3); 885 UNITTEST::TestRecursiveMessage message2; 886 EXPECT_FALSE(message2.ParseFromCodedStream(&input)); 887 } 888} 889 890TEST(WireFormatTest, LargeRecursionLimit) { 891 const int kLargeLimit = io::CodedInputStream::GetDefaultRecursionLimit() + 50; 892 UNITTEST::TestRecursiveMessage src, dst, *a; 893 a = src.mutable_a(); 894 for (int i = 0; i < kLargeLimit - 1; i++) { 895 a = a->mutable_a(); 896 } 897 a->set_i(1); 898 899 std::string data = src.SerializeAsString(); 900 { 901 // Parse with default recursion limit. Should fail. 902 io::ArrayInputStream raw_input(data.data(), data.size()); 903 io::CodedInputStream input(&raw_input); 904 ASSERT_FALSE(dst.ParseFromCodedStream(&input)); 905 } 906 907 { 908 // Parse with custom recursion limit. Should pass. 909 io::ArrayInputStream raw_input(data.data(), data.size()); 910 io::CodedInputStream input(&raw_input); 911 input.SetRecursionLimit(kLargeLimit); 912 ASSERT_TRUE(dst.ParseFromCodedStream(&input)); 913 } 914 915 // Verifies the recursion depth. 916 int depth = 1; 917 a = dst.mutable_a(); 918 while (a->has_a()) { 919 a = a->mutable_a(); 920 depth++; 921 } 922 923 EXPECT_EQ(a->i(), 1); 924 EXPECT_EQ(depth, kLargeLimit); 925} 926 927TEST(WireFormatTest, UnknownFieldRecursionLimit) { 928 UNITTEST::TestEmptyMessage message; 929 message.mutable_unknown_fields() 930 ->AddGroup(1234) 931 ->AddGroup(1234) 932 ->AddGroup(1234) 933 ->AddGroup(1234) 934 ->AddVarint(1234, 123); 935 std::string data; 936 message.SerializeToString(&data); 937 938 { 939 io::ArrayInputStream raw_input(data.data(), data.size()); 940 io::CodedInputStream input(&raw_input); 941 input.SetRecursionLimit(4); 942 UNITTEST::TestEmptyMessage message2; 943 EXPECT_TRUE(message2.ParseFromCodedStream(&input)); 944 } 945 946 { 947 io::ArrayInputStream raw_input(data.data(), data.size()); 948 io::CodedInputStream input(&raw_input); 949 input.SetRecursionLimit(3); 950 UNITTEST::TestEmptyMessage message2; 951 EXPECT_FALSE(message2.ParseFromCodedStream(&input)); 952 } 953} 954 955TEST(WireFormatTest, ZigZag) { 956 // shorthands to avoid excessive line-wrapping 957 auto ZigZagEncode32 = [](int32_t x) { 958 return WireFormatLite::ZigZagEncode32(x); 959 }; 960 auto ZigZagDecode32 = [](uint32_t x) { 961 return WireFormatLite::ZigZagDecode32(x); 962 }; 963 auto ZigZagEncode64 = [](int64_t x) { 964 return WireFormatLite::ZigZagEncode64(x); 965 }; 966 auto ZigZagDecode64 = [](uint64_t x) { 967 return WireFormatLite::ZigZagDecode64(x); 968 }; 969 970 EXPECT_EQ(0u, ZigZagEncode32(0)); 971 EXPECT_EQ(1u, ZigZagEncode32(-1)); 972 EXPECT_EQ(2u, ZigZagEncode32(1)); 973 EXPECT_EQ(3u, ZigZagEncode32(-2)); 974 EXPECT_EQ(0x7FFFFFFEu, ZigZagEncode32(0x3FFFFFFF)); 975 EXPECT_EQ(0x7FFFFFFFu, ZigZagEncode32(0xC0000000)); 976 EXPECT_EQ(0xFFFFFFFEu, ZigZagEncode32(0x7FFFFFFF)); 977 EXPECT_EQ(0xFFFFFFFFu, ZigZagEncode32(0x80000000)); 978 979 EXPECT_EQ(0, ZigZagDecode32(0u)); 980 EXPECT_EQ(-1, ZigZagDecode32(1u)); 981 EXPECT_EQ(1, ZigZagDecode32(2u)); 982 EXPECT_EQ(-2, ZigZagDecode32(3u)); 983 EXPECT_EQ(0x3FFFFFFF, ZigZagDecode32(0x7FFFFFFEu)); 984 EXPECT_EQ(0xC0000000, ZigZagDecode32(0x7FFFFFFFu)); 985 EXPECT_EQ(0x7FFFFFFF, ZigZagDecode32(0xFFFFFFFEu)); 986 EXPECT_EQ(0x80000000, ZigZagDecode32(0xFFFFFFFFu)); 987 988 EXPECT_EQ(0u, ZigZagEncode64(0)); 989 EXPECT_EQ(1u, ZigZagEncode64(-1)); 990 EXPECT_EQ(2u, ZigZagEncode64(1)); 991 EXPECT_EQ(3u, ZigZagEncode64(-2)); 992 EXPECT_EQ(0x000000007FFFFFFEu, ZigZagEncode64(0x000000003FFFFFFF)); 993 EXPECT_EQ(0x000000007FFFFFFFu, 994 ZigZagEncode64(absl::bit_cast<int64_t>(0xFFFFFFFFC0000000))); 995 EXPECT_EQ(0x00000000FFFFFFFEu, ZigZagEncode64(0x000000007FFFFFFF)); 996 EXPECT_EQ(0x00000000FFFFFFFFu, 997 ZigZagEncode64(absl::bit_cast<int64_t>(0xFFFFFFFF80000000))); 998 EXPECT_EQ(0xFFFFFFFFFFFFFFFEu, ZigZagEncode64(0x7FFFFFFFFFFFFFFF)); 999 EXPECT_EQ(0xFFFFFFFFFFFFFFFFu, 1000 ZigZagEncode64(absl::bit_cast<int64_t>(0x8000000000000000))); 1001 1002 EXPECT_EQ(0, ZigZagDecode64(0u)); 1003 EXPECT_EQ(-1, ZigZagDecode64(1u)); 1004 EXPECT_EQ(1, ZigZagDecode64(2u)); 1005 EXPECT_EQ(-2, ZigZagDecode64(3u)); 1006 EXPECT_EQ(0x000000003FFFFFFF, ZigZagDecode64(0x000000007FFFFFFEu)); 1007 EXPECT_EQ(absl::bit_cast<int64_t>(0xFFFFFFFFC0000000), 1008 ZigZagDecode64(0x000000007FFFFFFFu)); 1009 EXPECT_EQ(0x000000007FFFFFFF, ZigZagDecode64(0x00000000FFFFFFFEu)); 1010 EXPECT_EQ(absl::bit_cast<int64_t>(0xFFFFFFFF80000000), 1011 ZigZagDecode64(0x00000000FFFFFFFFu)); 1012 EXPECT_EQ(0x7FFFFFFFFFFFFFFF, ZigZagDecode64(0xFFFFFFFFFFFFFFFEu)); 1013 EXPECT_EQ(absl::bit_cast<int64_t>(0x8000000000000000), 1014 ZigZagDecode64(0xFFFFFFFFFFFFFFFFu)); 1015 1016 // Some easier-to-verify round-trip tests. The inputs (other than 0, 1, -1) 1017 // were chosen semi-randomly via keyboard bashing. 1018 EXPECT_EQ(0, ZigZagDecode32(ZigZagEncode32(0))); 1019 EXPECT_EQ(1, ZigZagDecode32(ZigZagEncode32(1))); 1020 EXPECT_EQ(-1, ZigZagDecode32(ZigZagEncode32(-1))); 1021 EXPECT_EQ(14927, ZigZagDecode32(ZigZagEncode32(14927))); 1022 EXPECT_EQ(-3612, ZigZagDecode32(ZigZagEncode32(-3612))); 1023 1024 EXPECT_EQ(0, ZigZagDecode64(ZigZagEncode64(0))); 1025 EXPECT_EQ(1, ZigZagDecode64(ZigZagEncode64(1))); 1026 EXPECT_EQ(-1, ZigZagDecode64(ZigZagEncode64(-1))); 1027 EXPECT_EQ(14927, ZigZagDecode64(ZigZagEncode64(14927))); 1028 EXPECT_EQ(-3612, ZigZagDecode64(ZigZagEncode64(-3612))); 1029 1030 EXPECT_EQ(856912304801416, ZigZagDecode64(ZigZagEncode64(856912304801416))); 1031 EXPECT_EQ(-75123905439571256, 1032 ZigZagDecode64(ZigZagEncode64(-75123905439571256))); 1033} 1034 1035TEST(WireFormatTest, RepeatedScalarsDifferentTagSizes) { 1036 // At one point checks would trigger when parsing repeated fixed scalar 1037 // fields. 1038 UNITTEST::TestRepeatedScalarDifferentTagSizes msg1, msg2; 1039 for (int i = 0; i < 100; ++i) { 1040 msg1.add_repeated_fixed32(i); 1041 msg1.add_repeated_int32(i); 1042 msg1.add_repeated_fixed64(i); 1043 msg1.add_repeated_int64(i); 1044 msg1.add_repeated_float(i); 1045 msg1.add_repeated_uint64(i); 1046 } 1047 1048 // Make sure that we have a variety of tag sizes. 1049 const Descriptor* desc = msg1.GetDescriptor(); 1050 const FieldDescriptor* field; 1051 field = desc->FindFieldByName("repeated_fixed32"); 1052 ASSERT_TRUE(field != nullptr); 1053 ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type())); 1054 field = desc->FindFieldByName("repeated_int32"); 1055 ASSERT_TRUE(field != nullptr); 1056 ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type())); 1057 field = desc->FindFieldByName("repeated_fixed64"); 1058 ASSERT_TRUE(field != nullptr); 1059 ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type())); 1060 field = desc->FindFieldByName("repeated_int64"); 1061 ASSERT_TRUE(field != nullptr); 1062 ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type())); 1063 field = desc->FindFieldByName("repeated_float"); 1064 ASSERT_TRUE(field != nullptr); 1065 ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type())); 1066 field = desc->FindFieldByName("repeated_uint64"); 1067 ASSERT_TRUE(field != nullptr); 1068 ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type())); 1069 1070 EXPECT_TRUE(msg2.ParseFromString(msg1.SerializeAsString())); 1071 EXPECT_EQ(msg1.DebugString(), msg2.DebugString()); 1072} 1073 1074TEST(WireFormatTest, CompatibleTypes) { 1075 const int64_t data = 0x100000000LL; 1076 UNITTEST::Int64Message msg1; 1077 msg1.set_data(data); 1078 std::string serialized; 1079 msg1.SerializeToString(&serialized); 1080 1081 // Test int64 is compatible with bool 1082 UNITTEST::BoolMessage msg2; 1083 ASSERT_TRUE(msg2.ParseFromString(serialized)); 1084 ASSERT_EQ(static_cast<bool>(data), msg2.data()); 1085 1086 // Test int64 is compatible with uint64 1087 UNITTEST::Uint64Message msg3; 1088 ASSERT_TRUE(msg3.ParseFromString(serialized)); 1089 ASSERT_EQ(static_cast<uint64_t>(data), msg3.data()); 1090 1091 // Test int64 is compatible with int32 1092 UNITTEST::Int32Message msg4; 1093 ASSERT_TRUE(msg4.ParseFromString(serialized)); 1094 ASSERT_EQ(static_cast<int32_t>(data), msg4.data()); 1095 1096 // Test int64 is compatible with uint32 1097 UNITTEST::Uint32Message msg5; 1098 ASSERT_TRUE(msg5.ParseFromString(serialized)); 1099 ASSERT_EQ(static_cast<uint32_t>(data), msg5.data()); 1100} 1101 1102class Proto3PrimitiveRepeatedWireFormatTest : public ::testing::Test { 1103 protected: 1104 Proto3PrimitiveRepeatedWireFormatTest() 1105 : packedTestAllTypes_( 1106 "\xFA\x01\x01\x01" 1107 "\x82\x02\x01\x01" 1108 "\x8A\x02\x01\x01" 1109 "\x92\x02\x01\x01" 1110 "\x9A\x02\x01\x02" 1111 "\xA2\x02\x01\x02" 1112 "\xAA\x02\x04\x01\x00\x00\x00" 1113 "\xB2\x02\x08\x01\x00\x00\x00\x00\x00\x00\x00" 1114 "\xBA\x02\x04\x01\x00\x00\x00" 1115 "\xC2\x02\x08\x01\x00\x00\x00\x00\x00\x00\x00" 1116 "\xCA\x02\x04\x00\x00\x80\x3f" 1117 "\xD2\x02\x08\x00\x00\x00\x00\x00\x00\xf0\x3f" 1118 "\xDA\x02\x01\x01" 1119 "\x9A\x03\x01\x01", 1120 86), 1121 packedTestUnpackedTypes_( 1122 "\x0A\x01\x01" 1123 "\x12\x01\x01" 1124 "\x1A\x01\x01" 1125 "\x22\x01\x01" 1126 "\x2A\x01\x02" 1127 "\x32\x01\x02" 1128 "\x3A\x04\x01\x00\x00\x00" 1129 "\x42\x08\x01\x00\x00\x00\x00\x00\x00\x00" 1130 "\x4A\x04\x01\x00\x00\x00" 1131 "\x52\x08\x01\x00\x00\x00\x00\x00\x00\x00" 1132 "\x5A\x04\x00\x00\x80\x3f" 1133 "\x62\x08\x00\x00\x00\x00\x00\x00\xf0\x3f" 1134 "\x6A\x01\x01" 1135 "\x72\x01\x01", 1136 72), 1137 unpackedTestAllTypes_( 1138 "\xF8\x01\x01" 1139 "\x80\x02\x01" 1140 "\x88\x02\x01" 1141 "\x90\x02\x01" 1142 "\x98\x02\x02" 1143 "\xA0\x02\x02" 1144 "\xAD\x02\x01\x00\x00\x00" 1145 "\xB1\x02\x01\x00\x00\x00\x00\x00\x00\x00" 1146 "\xBD\x02\x01\x00\x00\x00" 1147 "\xC1\x02\x01\x00\x00\x00\x00\x00\x00\x00" 1148 "\xCD\x02\x00\x00\x80\x3f" 1149 "\xD1\x02\x00\x00\x00\x00\x00\x00\xf0\x3f" 1150 "\xD8\x02\x01" 1151 "\x98\x03\x01", 1152 72), 1153 unpackedTestUnpackedTypes_( 1154 "\x08\x01" 1155 "\x10\x01" 1156 "\x18\x01" 1157 "\x20\x01" 1158 "\x28\x02" 1159 "\x30\x02" 1160 "\x3D\x01\x00\x00\x00" 1161 "\x41\x01\x00\x00\x00\x00\x00\x00\x00" 1162 "\x4D\x01\x00\x00\x00" 1163 "\x51\x01\x00\x00\x00\x00\x00\x00\x00" 1164 "\x5D\x00\x00\x80\x3f" 1165 "\x61\x00\x00\x00\x00\x00\x00\xf0\x3f" 1166 "\x68\x01" 1167 "\x70\x01", 1168 58) {} 1169 template <class Proto> 1170 void SetProto3PrimitiveRepeatedFields(Proto* message) { 1171 message->add_repeated_int32(1); 1172 message->add_repeated_int64(1); 1173 message->add_repeated_uint32(1); 1174 message->add_repeated_uint64(1); 1175 message->add_repeated_sint32(1); 1176 message->add_repeated_sint64(1); 1177 message->add_repeated_fixed32(1); 1178 message->add_repeated_fixed64(1); 1179 message->add_repeated_sfixed32(1); 1180 message->add_repeated_sfixed64(1); 1181 message->add_repeated_float(1.0); 1182 message->add_repeated_double(1.0); 1183 message->add_repeated_bool(true); 1184 message->add_repeated_nested_enum(PROTO3_ARENA_UNITTEST::TestAllTypes::FOO); 1185 } 1186 1187 template <class Proto> 1188 void ExpectProto3PrimitiveRepeatedFieldsSet(const Proto& message) { 1189 EXPECT_EQ(1, message.repeated_int32(0)); 1190 EXPECT_EQ(1, message.repeated_int64(0)); 1191 EXPECT_EQ(1, message.repeated_uint32(0)); 1192 EXPECT_EQ(1, message.repeated_uint64(0)); 1193 EXPECT_EQ(1, message.repeated_sint32(0)); 1194 EXPECT_EQ(1, message.repeated_sint64(0)); 1195 EXPECT_EQ(1, message.repeated_fixed32(0)); 1196 EXPECT_EQ(1, message.repeated_fixed64(0)); 1197 EXPECT_EQ(1, message.repeated_sfixed32(0)); 1198 EXPECT_EQ(1, message.repeated_sfixed64(0)); 1199 EXPECT_EQ(1.0, message.repeated_float(0)); 1200 EXPECT_EQ(1.0, message.repeated_double(0)); 1201 EXPECT_EQ(true, message.repeated_bool(0)); 1202 EXPECT_EQ(PROTO3_ARENA_UNITTEST::TestAllTypes::FOO, 1203 message.repeated_nested_enum(0)); 1204 } 1205 1206 template <class Proto> 1207 void TestSerialization(Proto* message, const std::string& expected) { 1208 SetProto3PrimitiveRepeatedFields(message); 1209 1210 size_t size = message->ByteSizeLong(); 1211 1212 // Serialize using the generated code. 1213 std::string generated_data; 1214 { 1215 io::StringOutputStream raw_output(&generated_data); 1216 io::CodedOutputStream output(&raw_output); 1217 message->SerializeWithCachedSizes(&output); 1218 ASSERT_FALSE(output.HadError()); 1219 } 1220 EXPECT_TRUE(TestUtil::EqualsToSerialized(*message, generated_data)); 1221 1222 // Serialize using the dynamic code. 1223 std::string dynamic_data; 1224 { 1225 io::StringOutputStream raw_output(&dynamic_data); 1226 io::CodedOutputStream output(&raw_output); 1227 WireFormat::SerializeWithCachedSizes(*message, size, &output); 1228 ASSERT_FALSE(output.HadError()); 1229 } 1230 EXPECT_TRUE(expected == dynamic_data); 1231 } 1232 1233 template <class Proto> 1234 void TestParsing(Proto* message, const std::string& compatible_data) { 1235 message->Clear(); 1236 message->ParseFromString(compatible_data); 1237 ExpectProto3PrimitiveRepeatedFieldsSet(*message); 1238 1239 message->Clear(); 1240 io::CodedInputStream input( 1241 reinterpret_cast<const uint8_t*>(compatible_data.data()), 1242 compatible_data.size()); 1243 WireFormat::ParseAndMergePartial(&input, message); 1244 ExpectProto3PrimitiveRepeatedFieldsSet(*message); 1245 } 1246 1247 const std::string packedTestAllTypes_; 1248 const std::string packedTestUnpackedTypes_; 1249 const std::string unpackedTestAllTypes_; 1250 const std::string unpackedTestUnpackedTypes_; 1251}; 1252 1253TEST_F(Proto3PrimitiveRepeatedWireFormatTest, Proto3PrimitiveRepeated) { 1254 PROTO3_ARENA_UNITTEST::TestAllTypes packed_message; 1255 PROTO3_ARENA_UNITTEST::TestUnpackedTypes unpacked_message; 1256 TestSerialization(&packed_message, packedTestAllTypes_); 1257 TestParsing(&packed_message, packedTestAllTypes_); 1258 TestParsing(&packed_message, unpackedTestAllTypes_); 1259 TestSerialization(&unpacked_message, unpackedTestUnpackedTypes_); 1260 TestParsing(&unpacked_message, packedTestUnpackedTypes_); 1261 TestParsing(&unpacked_message, unpackedTestUnpackedTypes_); 1262} 1263 1264class WireFormatInvalidInputTest : public testing::Test { 1265 protected: 1266 // Make a serialized TestAllTypes in which the field optional_nested_message 1267 // contains exactly the given bytes, which may be invalid. 1268 std::string MakeInvalidEmbeddedMessage(const char* bytes, int size) { 1269 const FieldDescriptor* field = 1270 UNITTEST::TestAllTypes::descriptor()->FindFieldByName( 1271 "optional_nested_message"); 1272 ABSL_CHECK(field != nullptr); 1273 1274 std::string result; 1275 1276 { 1277 io::StringOutputStream raw_output(&result); 1278 io::CodedOutputStream output(&raw_output); 1279 1280 WireFormatLite::WriteBytes(field->number(), std::string(bytes, size), 1281 &output); 1282 } 1283 1284 return result; 1285 } 1286 1287 // Make a serialized TestAllTypes in which the field optionalgroup 1288 // contains exactly the given bytes -- which may be invalid -- and 1289 // possibly no end tag. 1290 std::string MakeInvalidGroup(const char* bytes, int size, 1291 bool include_end_tag) { 1292 const FieldDescriptor* field = 1293 UNITTEST::TestAllTypes::descriptor()->FindFieldByName("optionalgroup"); 1294 ABSL_CHECK(field != nullptr); 1295 1296 std::string result; 1297 1298 { 1299 io::StringOutputStream raw_output(&result); 1300 io::CodedOutputStream output(&raw_output); 1301 1302 output.WriteVarint32(WireFormat::MakeTag(field)); 1303 output.WriteString(std::string(bytes, size)); 1304 if (include_end_tag) { 1305 output.WriteVarint32(WireFormatLite::MakeTag( 1306 field->number(), WireFormatLite::WIRETYPE_END_GROUP)); 1307 } 1308 } 1309 1310 return result; 1311 } 1312}; 1313 1314TEST_F(WireFormatInvalidInputTest, InvalidSubMessage) { 1315 UNITTEST::TestAllTypes message; 1316 1317 // Control case. 1318 EXPECT_TRUE(message.ParseFromString(MakeInvalidEmbeddedMessage("", 0))); 1319 1320 // The byte is a valid varint, but not a valid tag (zero). 1321 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\0", 1))); 1322 1323 // The byte is a malformed varint. 1324 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\200", 1))); 1325 1326 // The byte is an endgroup tag, but we aren't parsing a group. 1327 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\014", 1))); 1328 1329 // The byte is a valid varint but not a valid tag (bad wire type). 1330 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\017", 1))); 1331} 1332 1333TEST_F(WireFormatInvalidInputTest, InvalidMessageWithExtraZero) { 1334 std::string data; 1335 { 1336 // Serialize a valid proto 1337 UNITTEST::TestAllTypes message; 1338 message.set_optional_int32(1); 1339 message.SerializeToString(&data); 1340 data.push_back(0); // Append invalid zero tag 1341 } 1342 1343 // Control case. 1344 { 1345 io::ArrayInputStream ais(data.data(), data.size()); 1346 io::CodedInputStream is(&ais); 1347 UNITTEST::TestAllTypes message; 1348 // It should fail but currently passes. 1349 EXPECT_TRUE(message.MergePartialFromCodedStream(&is)); 1350 // Parsing from the string should fail. 1351 EXPECT_FALSE(message.ParseFromString(data)); 1352 } 1353} 1354 1355TEST_F(WireFormatInvalidInputTest, InvalidGroup) { 1356 UNITTEST::TestAllTypes message; 1357 1358 // Control case. 1359 EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true))); 1360 1361 // Missing end tag. Groups cannot end at EOF. 1362 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false))); 1363 1364 // The byte is a valid varint, but not a valid tag (zero). 1365 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false))); 1366 1367 // The byte is a malformed varint. 1368 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false))); 1369 1370 // The byte is an endgroup tag, but not the right one for this group. 1371 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false))); 1372 1373 // The byte is a valid varint but not a valid tag (bad wire type). 1374 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true))); 1375} 1376 1377TEST_F(WireFormatInvalidInputTest, InvalidUnknownGroup) { 1378 // Use TestEmptyMessage so that the group made by MakeInvalidGroup will not 1379 // be a known tag number. 1380 UNITTEST::TestEmptyMessage message; 1381 1382 // Control case. 1383 EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true))); 1384 1385 // Missing end tag. Groups cannot end at EOF. 1386 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false))); 1387 1388 // The byte is a valid varint, but not a valid tag (zero). 1389 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false))); 1390 1391 // The byte is a malformed varint. 1392 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false))); 1393 1394 // The byte is an endgroup tag, but not the right one for this group. 1395 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false))); 1396 1397 // The byte is a valid varint but not a valid tag (bad wire type). 1398 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true))); 1399} 1400 1401TEST_F(WireFormatInvalidInputTest, InvalidStringInUnknownGroup) { 1402 // Test a bug fix: SkipMessage should fail if the message contains a 1403 // string whose length would extend beyond the message end. 1404 1405 UNITTEST::TestAllTypes message; 1406 message.set_optional_string("foo foo foo foo"); 1407 std::string data; 1408 message.SerializeToString(&data); 1409 1410 // Chop some bytes off the end. 1411 data.resize(data.size() - 4); 1412 1413 // Try to skip it. Note that the bug was only present when parsing to an 1414 // UnknownFieldSet. 1415 io::ArrayInputStream raw_input(data.data(), data.size()); 1416 io::CodedInputStream coded_input(&raw_input); 1417 UnknownFieldSet unknown_fields; 1418 EXPECT_FALSE(WireFormat::SkipMessage(&coded_input, &unknown_fields)); 1419} 1420 1421// Test differences between string and bytes. 1422// Value of a string type must be valid UTF-8 string. When UTF-8 1423// validation is enabled (GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED): 1424// WriteInvalidUTF8String: see error message. 1425// ReadInvalidUTF8String: see error message. 1426// WriteValidUTF8String: fine. 1427// ReadValidUTF8String: fine. 1428// WriteAnyBytes: fine. 1429// ReadAnyBytes: fine. 1430const char* kInvalidUTF8String = "Invalid UTF-8: \xA0\xB0\xC0\xD0"; 1431// This used to be "Valid UTF-8: \x01\x02\u8C37\u6B4C", but MSVC seems to 1432// interpret \u differently from GCC. 1433const char* kValidUTF8String = "Valid UTF-8: \x01\x02\350\260\267\346\255\214"; 1434 1435template <typename T> 1436bool WriteMessage(const char* value, T* message, std::string* wire_buffer) { 1437 message->set_data(value); 1438 wire_buffer->clear(); 1439 message->AppendToString(wire_buffer); 1440 return (wire_buffer->size() > 0); 1441} 1442 1443template <typename T> 1444bool ReadMessage(const std::string& wire_buffer, T* message) { 1445 return message->ParseFromArray(wire_buffer.data(), wire_buffer.size()); 1446} 1447 1448class Utf8ValidationTest : public ::testing::Test { 1449 protected: 1450 Utf8ValidationTest() {} 1451 ~Utf8ValidationTest() override {} 1452 void SetUp() override { 1453 } 1454 1455}; 1456 1457TEST_F(Utf8ValidationTest, WriteInvalidUTF8String) { 1458 std::string wire_buffer; 1459 UNITTEST::OneString input; 1460 std::vector<std::string> errors; 1461 { 1462 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected); 1463#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1464 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, absl::StrCat( 1465 "String field '", UNITTEST_PACKAGE_NAME, 1466 ".OneString.data' " 1467 "contains invalid UTF-8 data when " 1468 "serializing a protocol buffer. Use the " 1469 "'bytes' type if you intend to send raw bytes. "))); 1470#else 1471 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0); 1472#endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1473 log.StartCapturingLogs(); 1474 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 1475 } 1476} 1477 1478 1479TEST_F(Utf8ValidationTest, ReadInvalidUTF8String) { 1480 std::string wire_buffer; 1481 UNITTEST::OneString input; 1482 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 1483 UNITTEST::OneString output; 1484 std::vector<std::string> errors; 1485 { 1486 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected); 1487#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1488 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, absl::StrCat( 1489 "String field '", UNITTEST_PACKAGE_NAME, 1490 ".OneString.data' " 1491 "contains invalid UTF-8 data when " 1492 "parsing a protocol buffer. Use the " 1493 "'bytes' type if you intend to send raw bytes. "))); 1494#else 1495 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0); 1496#endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1497 log.StartCapturingLogs(); 1498 ReadMessage(wire_buffer, &output); 1499 } 1500} 1501 1502 1503TEST_F(Utf8ValidationTest, WriteValidUTF8String) { 1504 std::string wire_buffer; 1505 UNITTEST::OneString input; 1506 { 1507 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected); 1508 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0); 1509 log.StartCapturingLogs(); 1510 WriteMessage(kValidUTF8String, &input, &wire_buffer); 1511 } 1512} 1513 1514TEST_F(Utf8ValidationTest, ReadValidUTF8String) { 1515 std::string wire_buffer; 1516 UNITTEST::OneString input; 1517 WriteMessage(kValidUTF8String, &input, &wire_buffer); 1518 UNITTEST::OneString output; 1519 { 1520 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected); 1521 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0); 1522 log.StartCapturingLogs(); 1523 ReadMessage(wire_buffer, &output); 1524 } 1525 EXPECT_EQ(input.data(), output.data()); 1526} 1527 1528// Bytes: anything can pass as bytes, use invalid UTF-8 string to test 1529TEST_F(Utf8ValidationTest, WriteArbitraryBytes) { 1530 std::string wire_buffer; 1531 UNITTEST::OneBytes input; 1532 { 1533 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected); 1534 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0); 1535 log.StartCapturingLogs(); 1536 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 1537 } 1538} 1539 1540TEST_F(Utf8ValidationTest, ReadArbitraryBytes) { 1541 std::string wire_buffer; 1542 UNITTEST::OneBytes input; 1543 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 1544 UNITTEST::OneBytes output; 1545 { 1546 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected); 1547 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0); 1548 log.StartCapturingLogs(); 1549 ReadMessage(wire_buffer, &output); 1550 } 1551 EXPECT_EQ(input.data(), output.data()); 1552} 1553 1554TEST_F(Utf8ValidationTest, ParseRepeatedString) { 1555 UNITTEST::MoreBytes input; 1556 input.add_data(kValidUTF8String); 1557 input.add_data(kInvalidUTF8String); 1558 input.add_data(kInvalidUTF8String); 1559 std::string wire_buffer = input.SerializeAsString(); 1560 1561 UNITTEST::MoreString output; 1562 { 1563 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected); 1564#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1565 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(2); 1566#else 1567 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0); 1568#endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1569 log.StartCapturingLogs(); 1570 ReadMessage(wire_buffer, &output); 1571 } 1572 EXPECT_EQ(wire_buffer, output.SerializeAsString()); 1573} 1574 1575// Test the old VerifyUTF8String() function, which may still be called by old 1576// generated code. 1577TEST_F(Utf8ValidationTest, OldVerifyUTF8String) { 1578 std::string data(kInvalidUTF8String); 1579 1580 { 1581 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected); 1582#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1583 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::StartsWith( 1584 "String field contains invalid UTF-8 data when " 1585 "serializing a protocol buffer. Use the " 1586 "'bytes' type if you intend to send raw bytes."))); 1587#else 1588 EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_, testing::_)).Times(0); 1589#endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1590 log.StartCapturingLogs(); 1591 WireFormat::VerifyUTF8String(data.data(), data.size(), 1592 WireFormat::SERIALIZE); 1593 } 1594} 1595 1596 1597TEST(RepeatedVarint, Int32) { 1598 RepeatedField<int32_t> v; 1599 1600 // Insert -2^n, 2^n and 2^n-1. 1601 for (int n = 0; n < 10; n++) { 1602 v.Add(-(1 << n)); 1603 v.Add(1 << n); 1604 v.Add((1 << n) - 1); 1605 } 1606 1607 // Check consistency with the scalar Int32Size. 1608 size_t expected = 0; 1609 for (int i = 0; i < v.size(); i++) { 1610 expected += WireFormatLite::Int32Size(v[i]); 1611 } 1612 1613 EXPECT_EQ(expected, WireFormatLite::Int32Size(v)); 1614} 1615 1616TEST(RepeatedVarint, Int64) { 1617 RepeatedField<int64_t> v; 1618 1619 // Insert -2^n, 2^n and 2^n-1. 1620 for (int n = 0; n < 10; n++) { 1621 v.Add(-(1 << n)); 1622 v.Add(1 << n); 1623 v.Add((1 << n) - 1); 1624 } 1625 1626 // Check consistency with the scalar Int64Size. 1627 size_t expected = 0; 1628 for (int i = 0; i < v.size(); i++) { 1629 expected += WireFormatLite::Int64Size(v[i]); 1630 } 1631 1632 EXPECT_EQ(expected, WireFormatLite::Int64Size(v)); 1633} 1634 1635TEST(RepeatedVarint, SInt32) { 1636 RepeatedField<int32_t> v; 1637 1638 // Insert -2^n, 2^n and 2^n-1. 1639 for (int n = 0; n < 10; n++) { 1640 v.Add(-(1 << n)); 1641 v.Add(1 << n); 1642 v.Add((1 << n) - 1); 1643 } 1644 1645 // Check consistency with the scalar SInt32Size. 1646 size_t expected = 0; 1647 for (int i = 0; i < v.size(); i++) { 1648 expected += WireFormatLite::SInt32Size(v[i]); 1649 } 1650 1651 EXPECT_EQ(expected, WireFormatLite::SInt32Size(v)); 1652} 1653 1654TEST(RepeatedVarint, SInt64) { 1655 RepeatedField<int64_t> v; 1656 1657 // Insert -2^n, 2^n and 2^n-1. 1658 for (int n = 0; n < 10; n++) { 1659 v.Add(-(1 << n)); 1660 v.Add(1 << n); 1661 v.Add((1 << n) - 1); 1662 } 1663 1664 // Check consistency with the scalar SInt64Size. 1665 size_t expected = 0; 1666 for (int i = 0; i < v.size(); i++) { 1667 expected += WireFormatLite::SInt64Size(v[i]); 1668 } 1669 1670 EXPECT_EQ(expected, WireFormatLite::SInt64Size(v)); 1671} 1672 1673TEST(RepeatedVarint, UInt32) { 1674 RepeatedField<uint32_t> v; 1675 1676 // Insert 2^n and 2^n-1. 1677 for (int n = 0; n < 10; n++) { 1678 v.Add(1 << n); 1679 v.Add((1 << n) - 1); 1680 } 1681 1682 // Check consistency with the scalar UInt32Size. 1683 size_t expected = 0; 1684 for (int i = 0; i < v.size(); i++) { 1685 expected += WireFormatLite::UInt32Size(v[i]); 1686 } 1687 1688 EXPECT_EQ(expected, WireFormatLite::UInt32Size(v)); 1689} 1690 1691TEST(RepeatedVarint, UInt64) { 1692 RepeatedField<uint64_t> v; 1693 1694 // Insert 2^n and 2^n-1. 1695 for (int n = 0; n < 10; n++) { 1696 v.Add(1 << n); 1697 v.Add((1 << n) - 1); 1698 } 1699 1700 // Check consistency with the scalar UInt64Size. 1701 size_t expected = 0; 1702 for (int i = 0; i < v.size(); i++) { 1703 expected += WireFormatLite::UInt64Size(v[i]); 1704 } 1705 1706 EXPECT_EQ(expected, WireFormatLite::UInt64Size(v)); 1707} 1708 1709TEST(RepeatedVarint, Enum) { 1710 RepeatedField<int> v; 1711 1712 // Insert 2^n and 2^n-1. 1713 for (int n = 0; n < 10; n++) { 1714 v.Add(1 << n); 1715 v.Add((1 << n) - 1); 1716 } 1717 1718 // Check consistency with the scalar EnumSize. 1719 size_t expected = 0; 1720 for (int i = 0; i < v.size(); i++) { 1721 expected += WireFormatLite::EnumSize(v[i]); 1722 } 1723 1724 EXPECT_EQ(expected, WireFormatLite::EnumSize(v)); 1725} 1726 1727 1728} // namespace 1729} // namespace internal 1730} // namespace protobuf 1731} // namespace google 1732 1733#include "google/protobuf/port_undef.inc" 1734