1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 // Author: kenton (at) google.com (Kenton Varda) 32 // Based on original Protocol Buffers design by 33 // Sanjay Ghemawat, Jeff Dean, and others. 34 35 #include <google/protobuf/wire_format.h> 36 #include <google/protobuf/wire_format_lite_inl.h> 37 #include <google/protobuf/descriptor.h> 38 #include <google/protobuf/io/zero_copy_stream_impl.h> 39 #include <google/protobuf/io/coded_stream.h> 40 #include <google/protobuf/unittest.pb.h> 41 #include <google/protobuf/unittest_proto3_arena.pb.h> 42 #include <google/protobuf/unittest_mset.pb.h> 43 #include <google/protobuf/unittest_mset_wire_format.pb.h> 44 #include <google/protobuf/test_util.h> 45 46 #include <google/protobuf/stubs/logging.h> 47 #include <google/protobuf/stubs/common.h> 48 #include <google/protobuf/stubs/logging.h> 49 #include <google/protobuf/testing/googletest.h> 50 #include <gtest/gtest.h> 51 #include <google/protobuf/stubs/stl_util.h> 52 53 namespace google { 54 namespace protobuf { 55 namespace internal { 56 namespace { 57 58 TEST(WireFormatTest, EnumsInSync) { 59 // Verify that WireFormatLite::FieldType and WireFormatLite::CppType match 60 // FieldDescriptor::Type and FieldDescriptor::CppType. 61 62 EXPECT_EQ(implicit_cast<int>(FieldDescriptor::MAX_TYPE), 63 implicit_cast<int>(WireFormatLite::MAX_FIELD_TYPE)); 64 EXPECT_EQ(implicit_cast<int>(FieldDescriptor::MAX_CPPTYPE), 65 implicit_cast<int>(WireFormatLite::MAX_CPPTYPE)); 66 67 for (int i = 1; i <= WireFormatLite::MAX_FIELD_TYPE; i++) { 68 EXPECT_EQ( 69 implicit_cast<int>(FieldDescriptor::TypeToCppType( 70 static_cast<FieldDescriptor::Type>(i))), 71 implicit_cast<int>(WireFormatLite::FieldTypeToCppType( 72 static_cast<WireFormatLite::FieldType>(i)))); 73 } 74 } 75 76 TEST(WireFormatTest, MaxFieldNumber) { 77 // Make sure the max field number constant is accurate. 78 EXPECT_EQ((1 << (32 - WireFormatLite::kTagTypeBits)) - 1, 79 FieldDescriptor::kMaxNumber); 80 } 81 82 TEST(WireFormatTest, Parse) { 83 unittest::TestAllTypes source, dest; 84 string data; 85 86 // Serialize using the generated code. 87 TestUtil::SetAllFields(&source); 88 source.SerializeToString(&data); 89 90 // Parse using WireFormat. 91 io::ArrayInputStream raw_input(data.data(), data.size()); 92 io::CodedInputStream input(&raw_input); 93 WireFormat::ParseAndMergePartial(&input, &dest); 94 95 // Check. 96 TestUtil::ExpectAllFieldsSet(dest); 97 } 98 99 TEST(WireFormatTest, ParseExtensions) { 100 unittest::TestAllExtensions source, dest; 101 string data; 102 103 // Serialize using the generated code. 104 TestUtil::SetAllExtensions(&source); 105 source.SerializeToString(&data); 106 107 // Parse using WireFormat. 108 io::ArrayInputStream raw_input(data.data(), data.size()); 109 io::CodedInputStream input(&raw_input); 110 WireFormat::ParseAndMergePartial(&input, &dest); 111 112 // Check. 113 TestUtil::ExpectAllExtensionsSet(dest); 114 } 115 116 TEST(WireFormatTest, ParsePacked) { 117 unittest::TestPackedTypes source, dest; 118 string data; 119 120 // Serialize using the generated code. 121 TestUtil::SetPackedFields(&source); 122 source.SerializeToString(&data); 123 124 // Parse using WireFormat. 125 io::ArrayInputStream raw_input(data.data(), data.size()); 126 io::CodedInputStream input(&raw_input); 127 WireFormat::ParseAndMergePartial(&input, &dest); 128 129 // Check. 130 TestUtil::ExpectPackedFieldsSet(dest); 131 } 132 133 TEST(WireFormatTest, ParsePackedFromUnpacked) { 134 // Serialize using the generated code. 135 unittest::TestUnpackedTypes source; 136 TestUtil::SetUnpackedFields(&source); 137 string data = source.SerializeAsString(); 138 139 // Parse using WireFormat. 140 unittest::TestPackedTypes dest; 141 io::ArrayInputStream raw_input(data.data(), data.size()); 142 io::CodedInputStream input(&raw_input); 143 WireFormat::ParseAndMergePartial(&input, &dest); 144 145 // Check. 146 TestUtil::ExpectPackedFieldsSet(dest); 147 } 148 149 TEST(WireFormatTest, ParseUnpackedFromPacked) { 150 // Serialize using the generated code. 151 unittest::TestPackedTypes source; 152 TestUtil::SetPackedFields(&source); 153 string data = source.SerializeAsString(); 154 155 // Parse using WireFormat. 156 unittest::TestUnpackedTypes dest; 157 io::ArrayInputStream raw_input(data.data(), data.size()); 158 io::CodedInputStream input(&raw_input); 159 WireFormat::ParseAndMergePartial(&input, &dest); 160 161 // Check. 162 TestUtil::ExpectUnpackedFieldsSet(dest); 163 } 164 165 TEST(WireFormatTest, ParsePackedExtensions) { 166 unittest::TestPackedExtensions source, dest; 167 string data; 168 169 // Serialize using the generated code. 170 TestUtil::SetPackedExtensions(&source); 171 source.SerializeToString(&data); 172 173 // Parse using WireFormat. 174 io::ArrayInputStream raw_input(data.data(), data.size()); 175 io::CodedInputStream input(&raw_input); 176 WireFormat::ParseAndMergePartial(&input, &dest); 177 178 // Check. 179 TestUtil::ExpectPackedExtensionsSet(dest); 180 } 181 182 TEST(WireFormatTest, ParseOneof) { 183 unittest::TestOneof2 source, dest; 184 string data; 185 186 // Serialize using the generated code. 187 TestUtil::SetOneof1(&source); 188 source.SerializeToString(&data); 189 190 // Parse using WireFormat. 191 io::ArrayInputStream raw_input(data.data(), data.size()); 192 io::CodedInputStream input(&raw_input); 193 WireFormat::ParseAndMergePartial(&input, &dest); 194 195 // Check. 196 TestUtil::ExpectOneofSet1(dest); 197 } 198 199 TEST(WireFormatTest, OneofOnlySetLast) { 200 unittest::TestOneofBackwardsCompatible source; 201 unittest::TestOneof oneof_dest; 202 string data; 203 204 // Set two fields 205 source.set_foo_int(100); 206 source.set_foo_string("101"); 207 208 // Serialize and parse to oneof message. 209 source.SerializeToString(&data); 210 io::ArrayInputStream raw_input(data.data(), data.size()); 211 io::CodedInputStream input(&raw_input); 212 WireFormat::ParseAndMergePartial(&input, &oneof_dest); 213 214 // Only the last field is set. 215 EXPECT_FALSE(oneof_dest.has_foo_int()); 216 EXPECT_TRUE(oneof_dest.has_foo_string()); 217 } 218 219 TEST(WireFormatTest, ByteSize) { 220 unittest::TestAllTypes message; 221 TestUtil::SetAllFields(&message); 222 223 EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message)); 224 message.Clear(); 225 EXPECT_EQ(0, message.ByteSize()); 226 EXPECT_EQ(0, WireFormat::ByteSize(message)); 227 } 228 229 TEST(WireFormatTest, ByteSizeExtensions) { 230 unittest::TestAllExtensions message; 231 TestUtil::SetAllExtensions(&message); 232 233 EXPECT_EQ(message.ByteSize(), 234 WireFormat::ByteSize(message)); 235 message.Clear(); 236 EXPECT_EQ(0, message.ByteSize()); 237 EXPECT_EQ(0, WireFormat::ByteSize(message)); 238 } 239 240 TEST(WireFormatTest, ByteSizePacked) { 241 unittest::TestPackedTypes message; 242 TestUtil::SetPackedFields(&message); 243 244 EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message)); 245 message.Clear(); 246 EXPECT_EQ(0, message.ByteSize()); 247 EXPECT_EQ(0, WireFormat::ByteSize(message)); 248 } 249 250 TEST(WireFormatTest, ByteSizePackedExtensions) { 251 unittest::TestPackedExtensions message; 252 TestUtil::SetPackedExtensions(&message); 253 254 EXPECT_EQ(message.ByteSize(), 255 WireFormat::ByteSize(message)); 256 message.Clear(); 257 EXPECT_EQ(0, message.ByteSize()); 258 EXPECT_EQ(0, WireFormat::ByteSize(message)); 259 } 260 261 TEST(WireFormatTest, ByteSizeOneof) { 262 unittest::TestOneof2 message; 263 TestUtil::SetOneof1(&message); 264 265 EXPECT_EQ(message.ByteSize(), 266 WireFormat::ByteSize(message)); 267 message.Clear(); 268 269 EXPECT_EQ(0, message.ByteSize()); 270 EXPECT_EQ(0, WireFormat::ByteSize(message)); 271 } 272 273 TEST(WireFormatTest, Serialize) { 274 unittest::TestAllTypes message; 275 string generated_data; 276 string dynamic_data; 277 278 TestUtil::SetAllFields(&message); 279 int size = message.ByteSize(); 280 281 // Serialize using the generated code. 282 { 283 io::StringOutputStream raw_output(&generated_data); 284 io::CodedOutputStream output(&raw_output); 285 message.SerializeWithCachedSizes(&output); 286 ASSERT_FALSE(output.HadError()); 287 } 288 289 // Serialize using WireFormat. 290 { 291 io::StringOutputStream raw_output(&dynamic_data); 292 io::CodedOutputStream output(&raw_output); 293 WireFormat::SerializeWithCachedSizes(message, size, &output); 294 ASSERT_FALSE(output.HadError()); 295 } 296 297 // Should be the same. 298 // Don't use EXPECT_EQ here because we're comparing raw binary data and 299 // we really don't want it dumped to stdout on failure. 300 EXPECT_TRUE(dynamic_data == generated_data); 301 } 302 303 TEST(WireFormatTest, SerializeExtensions) { 304 unittest::TestAllExtensions message; 305 string generated_data; 306 string dynamic_data; 307 308 TestUtil::SetAllExtensions(&message); 309 int size = message.ByteSize(); 310 311 // Serialize using the generated code. 312 { 313 io::StringOutputStream raw_output(&generated_data); 314 io::CodedOutputStream output(&raw_output); 315 message.SerializeWithCachedSizes(&output); 316 ASSERT_FALSE(output.HadError()); 317 } 318 319 // Serialize using WireFormat. 320 { 321 io::StringOutputStream raw_output(&dynamic_data); 322 io::CodedOutputStream output(&raw_output); 323 WireFormat::SerializeWithCachedSizes(message, size, &output); 324 ASSERT_FALSE(output.HadError()); 325 } 326 327 // Should be the same. 328 // Don't use EXPECT_EQ here because we're comparing raw binary data and 329 // we really don't want it dumped to stdout on failure. 330 EXPECT_TRUE(dynamic_data == generated_data); 331 } 332 333 TEST(WireFormatTest, SerializeFieldsAndExtensions) { 334 unittest::TestFieldOrderings message; 335 string generated_data; 336 string dynamic_data; 337 338 TestUtil::SetAllFieldsAndExtensions(&message); 339 int size = message.ByteSize(); 340 341 // Serialize using the generated code. 342 { 343 io::StringOutputStream raw_output(&generated_data); 344 io::CodedOutputStream output(&raw_output); 345 message.SerializeWithCachedSizes(&output); 346 ASSERT_FALSE(output.HadError()); 347 } 348 349 // Serialize using WireFormat. 350 { 351 io::StringOutputStream raw_output(&dynamic_data); 352 io::CodedOutputStream output(&raw_output); 353 WireFormat::SerializeWithCachedSizes(message, size, &output); 354 ASSERT_FALSE(output.HadError()); 355 } 356 357 // Should be the same. 358 // Don't use EXPECT_EQ here because we're comparing raw binary data and 359 // we really don't want it dumped to stdout on failure. 360 EXPECT_TRUE(dynamic_data == generated_data); 361 362 // Should output in canonical order. 363 TestUtil::ExpectAllFieldsAndExtensionsInOrder(dynamic_data); 364 TestUtil::ExpectAllFieldsAndExtensionsInOrder(generated_data); 365 } 366 367 TEST(WireFormatTest, SerializeOneof) { 368 unittest::TestOneof2 message; 369 string generated_data; 370 string dynamic_data; 371 372 TestUtil::SetOneof1(&message); 373 int size = message.ByteSize(); 374 375 // Serialize using the generated code. 376 { 377 io::StringOutputStream raw_output(&generated_data); 378 io::CodedOutputStream output(&raw_output); 379 message.SerializeWithCachedSizes(&output); 380 ASSERT_FALSE(output.HadError()); 381 } 382 383 // Serialize using WireFormat. 384 { 385 io::StringOutputStream raw_output(&dynamic_data); 386 io::CodedOutputStream output(&raw_output); 387 WireFormat::SerializeWithCachedSizes(message, size, &output); 388 ASSERT_FALSE(output.HadError()); 389 } 390 391 // Should be the same. 392 // Don't use EXPECT_EQ here because we're comparing raw binary data and 393 // we really don't want it dumped to stdout on failure. 394 EXPECT_TRUE(dynamic_data == generated_data); 395 } 396 397 TEST(WireFormatTest, ParseMultipleExtensionRanges) { 398 // Make sure we can parse a message that contains multiple extensions ranges. 399 unittest::TestFieldOrderings source; 400 string data; 401 402 TestUtil::SetAllFieldsAndExtensions(&source); 403 source.SerializeToString(&data); 404 405 { 406 unittest::TestFieldOrderings dest; 407 EXPECT_TRUE(dest.ParseFromString(data)); 408 EXPECT_EQ(source.DebugString(), dest.DebugString()); 409 } 410 411 // Also test using reflection-based parsing. 412 { 413 unittest::TestFieldOrderings dest; 414 io::ArrayInputStream raw_input(data.data(), data.size()); 415 io::CodedInputStream coded_input(&raw_input); 416 EXPECT_TRUE(WireFormat::ParseAndMergePartial(&coded_input, &dest)); 417 EXPECT_EQ(source.DebugString(), dest.DebugString()); 418 } 419 } 420 421 const int kUnknownTypeId = 1550055; 422 423 TEST(WireFormatTest, SerializeMessageSet) { 424 // Set up a TestMessageSet with two known messages and an unknown one. 425 proto2_wireformat_unittest::TestMessageSet message_set; 426 message_set.MutableExtension( 427 unittest::TestMessageSetExtension1::message_set_extension)->set_i(123); 428 message_set.MutableExtension( 429 unittest::TestMessageSetExtension2::message_set_extension)->set_str("foo"); 430 message_set.mutable_unknown_fields()->AddLengthDelimited( 431 kUnknownTypeId, "bar"); 432 433 string data; 434 ASSERT_TRUE(message_set.SerializeToString(&data)); 435 436 // Parse back using RawMessageSet and check the contents. 437 unittest::RawMessageSet raw; 438 ASSERT_TRUE(raw.ParseFromString(data)); 439 440 EXPECT_EQ(0, raw.unknown_fields().field_count()); 441 442 ASSERT_EQ(3, raw.item_size()); 443 EXPECT_EQ( 444 unittest::TestMessageSetExtension1::descriptor()->extension(0)->number(), 445 raw.item(0).type_id()); 446 EXPECT_EQ( 447 unittest::TestMessageSetExtension2::descriptor()->extension(0)->number(), 448 raw.item(1).type_id()); 449 EXPECT_EQ(kUnknownTypeId, raw.item(2).type_id()); 450 451 unittest::TestMessageSetExtension1 message1; 452 EXPECT_TRUE(message1.ParseFromString(raw.item(0).message())); 453 EXPECT_EQ(123, message1.i()); 454 455 unittest::TestMessageSetExtension2 message2; 456 EXPECT_TRUE(message2.ParseFromString(raw.item(1).message())); 457 EXPECT_EQ("foo", message2.str()); 458 459 EXPECT_EQ("bar", raw.item(2).message()); 460 } 461 462 TEST(WireFormatTest, SerializeMessageSetVariousWaysAreEqual) { 463 // Serialize a MessageSet to a stream and to a flat array using generated 464 // code, and also using WireFormat, and check that the results are equal. 465 // Set up a TestMessageSet with two known messages and an unknown one, as 466 // above. 467 468 proto2_wireformat_unittest::TestMessageSet message_set; 469 message_set.MutableExtension( 470 unittest::TestMessageSetExtension1::message_set_extension)->set_i(123); 471 message_set.MutableExtension( 472 unittest::TestMessageSetExtension2::message_set_extension)->set_str("foo"); 473 message_set.mutable_unknown_fields()->AddLengthDelimited( 474 kUnknownTypeId, "bar"); 475 476 int size = message_set.ByteSize(); 477 EXPECT_EQ(size, message_set.GetCachedSize()); 478 ASSERT_EQ(size, WireFormat::ByteSize(message_set)); 479 480 string flat_data; 481 string stream_data; 482 string dynamic_data; 483 flat_data.resize(size); 484 stream_data.resize(size); 485 486 // Serialize to flat array 487 { 488 uint8* target = reinterpret_cast<uint8*>(string_as_array(&flat_data)); 489 uint8* end = message_set.SerializeWithCachedSizesToArray(target); 490 EXPECT_EQ(size, end - target); 491 } 492 493 // Serialize to buffer 494 { 495 io::ArrayOutputStream array_stream(string_as_array(&stream_data), size, 1); 496 io::CodedOutputStream output_stream(&array_stream); 497 message_set.SerializeWithCachedSizes(&output_stream); 498 ASSERT_FALSE(output_stream.HadError()); 499 } 500 501 // Serialize to buffer with WireFormat. 502 { 503 io::StringOutputStream string_stream(&dynamic_data); 504 io::CodedOutputStream output_stream(&string_stream); 505 WireFormat::SerializeWithCachedSizes(message_set, size, &output_stream); 506 ASSERT_FALSE(output_stream.HadError()); 507 } 508 509 EXPECT_TRUE(flat_data == stream_data); 510 EXPECT_TRUE(flat_data == dynamic_data); 511 } 512 513 TEST(WireFormatTest, ParseMessageSet) { 514 // Set up a RawMessageSet with two known messages and an unknown one. 515 unittest::RawMessageSet raw; 516 517 { 518 unittest::RawMessageSet::Item* item = raw.add_item(); 519 item->set_type_id( 520 unittest::TestMessageSetExtension1::descriptor()->extension(0)->number()); 521 unittest::TestMessageSetExtension1 message; 522 message.set_i(123); 523 message.SerializeToString(item->mutable_message()); 524 } 525 526 { 527 unittest::RawMessageSet::Item* item = raw.add_item(); 528 item->set_type_id( 529 unittest::TestMessageSetExtension2::descriptor()->extension(0)->number()); 530 unittest::TestMessageSetExtension2 message; 531 message.set_str("foo"); 532 message.SerializeToString(item->mutable_message()); 533 } 534 535 { 536 unittest::RawMessageSet::Item* item = raw.add_item(); 537 item->set_type_id(kUnknownTypeId); 538 item->set_message("bar"); 539 } 540 541 string data; 542 ASSERT_TRUE(raw.SerializeToString(&data)); 543 544 // Parse as a TestMessageSet and check the contents. 545 proto2_wireformat_unittest::TestMessageSet message_set; 546 ASSERT_TRUE(message_set.ParseFromString(data)); 547 548 EXPECT_EQ(123, message_set.GetExtension( 549 unittest::TestMessageSetExtension1::message_set_extension).i()); 550 EXPECT_EQ("foo", message_set.GetExtension( 551 unittest::TestMessageSetExtension2::message_set_extension).str()); 552 553 ASSERT_EQ(1, message_set.unknown_fields().field_count()); 554 ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED, 555 message_set.unknown_fields().field(0).type()); 556 EXPECT_EQ("bar", message_set.unknown_fields().field(0).length_delimited()); 557 558 // Also parse using WireFormat. 559 proto2_wireformat_unittest::TestMessageSet dynamic_message_set; 560 io::CodedInputStream input(reinterpret_cast<const uint8*>(data.data()), 561 data.size()); 562 ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &dynamic_message_set)); 563 EXPECT_EQ(message_set.DebugString(), dynamic_message_set.DebugString()); 564 } 565 566 TEST(WireFormatTest, ParseMessageSetWithReverseTagOrder) { 567 string data; 568 { 569 unittest::TestMessageSetExtension1 message; 570 message.set_i(123); 571 // Build a MessageSet manually with its message content put before its 572 // type_id. 573 io::StringOutputStream output_stream(&data); 574 io::CodedOutputStream coded_output(&output_stream); 575 coded_output.WriteTag(WireFormatLite::kMessageSetItemStartTag); 576 // Write the message content first. 577 WireFormatLite::WriteTag(WireFormatLite::kMessageSetMessageNumber, 578 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, 579 &coded_output); 580 coded_output.WriteVarint32(message.ByteSize()); 581 message.SerializeWithCachedSizes(&coded_output); 582 // Write the type id. 583 uint32 type_id = message.GetDescriptor()->extension(0)->number(); 584 WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, 585 type_id, &coded_output); 586 coded_output.WriteTag(WireFormatLite::kMessageSetItemEndTag); 587 } 588 { 589 proto2_wireformat_unittest::TestMessageSet message_set; 590 ASSERT_TRUE(message_set.ParseFromString(data)); 591 592 EXPECT_EQ(123, message_set.GetExtension( 593 unittest::TestMessageSetExtension1::message_set_extension).i()); 594 } 595 { 596 // Test parse the message via Reflection. 597 proto2_wireformat_unittest::TestMessageSet message_set; 598 io::CodedInputStream input( 599 reinterpret_cast<const uint8*>(data.data()), data.size()); 600 EXPECT_TRUE(WireFormat::ParseAndMergePartial(&input, &message_set)); 601 EXPECT_TRUE(input.ConsumedEntireMessage()); 602 603 EXPECT_EQ(123, message_set.GetExtension( 604 unittest::TestMessageSetExtension1::message_set_extension).i()); 605 } 606 } 607 608 TEST(WireFormatTest, ParseBrokenMessageSet) { 609 proto2_wireformat_unittest::TestMessageSet message_set; 610 string input("goodbye"); // Invalid wire format data. 611 EXPECT_FALSE(message_set.ParseFromString(input)); 612 } 613 614 TEST(WireFormatTest, RecursionLimit) { 615 unittest::TestRecursiveMessage message; 616 message.mutable_a()->mutable_a()->mutable_a()->mutable_a()->set_i(1); 617 string data; 618 message.SerializeToString(&data); 619 620 { 621 io::ArrayInputStream raw_input(data.data(), data.size()); 622 io::CodedInputStream input(&raw_input); 623 input.SetRecursionLimit(4); 624 unittest::TestRecursiveMessage message2; 625 EXPECT_TRUE(message2.ParseFromCodedStream(&input)); 626 } 627 628 { 629 io::ArrayInputStream raw_input(data.data(), data.size()); 630 io::CodedInputStream input(&raw_input); 631 input.SetRecursionLimit(3); 632 unittest::TestRecursiveMessage message2; 633 EXPECT_FALSE(message2.ParseFromCodedStream(&input)); 634 } 635 } 636 637 TEST(WireFormatTest, UnknownFieldRecursionLimit) { 638 unittest::TestEmptyMessage message; 639 message.mutable_unknown_fields() 640 ->AddGroup(1234) 641 ->AddGroup(1234) 642 ->AddGroup(1234) 643 ->AddGroup(1234) 644 ->AddVarint(1234, 123); 645 string data; 646 message.SerializeToString(&data); 647 648 { 649 io::ArrayInputStream raw_input(data.data(), data.size()); 650 io::CodedInputStream input(&raw_input); 651 input.SetRecursionLimit(4); 652 unittest::TestEmptyMessage message2; 653 EXPECT_TRUE(message2.ParseFromCodedStream(&input)); 654 } 655 656 { 657 io::ArrayInputStream raw_input(data.data(), data.size()); 658 io::CodedInputStream input(&raw_input); 659 input.SetRecursionLimit(3); 660 unittest::TestEmptyMessage message2; 661 EXPECT_FALSE(message2.ParseFromCodedStream(&input)); 662 } 663 } 664 665 TEST(WireFormatTest, ZigZag) { 666 // avoid line-wrapping 667 #define LL(x) GOOGLE_LONGLONG(x) 668 #define ULL(x) GOOGLE_ULONGLONG(x) 669 #define ZigZagEncode32(x) WireFormatLite::ZigZagEncode32(x) 670 #define ZigZagDecode32(x) WireFormatLite::ZigZagDecode32(x) 671 #define ZigZagEncode64(x) WireFormatLite::ZigZagEncode64(x) 672 #define ZigZagDecode64(x) WireFormatLite::ZigZagDecode64(x) 673 674 EXPECT_EQ(0u, ZigZagEncode32( 0)); 675 EXPECT_EQ(1u, ZigZagEncode32(-1)); 676 EXPECT_EQ(2u, ZigZagEncode32( 1)); 677 EXPECT_EQ(3u, ZigZagEncode32(-2)); 678 EXPECT_EQ(0x7FFFFFFEu, ZigZagEncode32(0x3FFFFFFF)); 679 EXPECT_EQ(0x7FFFFFFFu, ZigZagEncode32(0xC0000000)); 680 EXPECT_EQ(0xFFFFFFFEu, ZigZagEncode32(0x7FFFFFFF)); 681 EXPECT_EQ(0xFFFFFFFFu, ZigZagEncode32(0x80000000)); 682 683 EXPECT_EQ( 0, ZigZagDecode32(0u)); 684 EXPECT_EQ(-1, ZigZagDecode32(1u)); 685 EXPECT_EQ( 1, ZigZagDecode32(2u)); 686 EXPECT_EQ(-2, ZigZagDecode32(3u)); 687 EXPECT_EQ(0x3FFFFFFF, ZigZagDecode32(0x7FFFFFFEu)); 688 EXPECT_EQ(0xC0000000, ZigZagDecode32(0x7FFFFFFFu)); 689 EXPECT_EQ(0x7FFFFFFF, ZigZagDecode32(0xFFFFFFFEu)); 690 EXPECT_EQ(0x80000000, ZigZagDecode32(0xFFFFFFFFu)); 691 692 EXPECT_EQ(0u, ZigZagEncode64( 0)); 693 EXPECT_EQ(1u, ZigZagEncode64(-1)); 694 EXPECT_EQ(2u, ZigZagEncode64( 1)); 695 EXPECT_EQ(3u, ZigZagEncode64(-2)); 696 EXPECT_EQ(ULL(0x000000007FFFFFFE), ZigZagEncode64(LL(0x000000003FFFFFFF))); 697 EXPECT_EQ(ULL(0x000000007FFFFFFF), ZigZagEncode64(LL(0xFFFFFFFFC0000000))); 698 EXPECT_EQ(ULL(0x00000000FFFFFFFE), ZigZagEncode64(LL(0x000000007FFFFFFF))); 699 EXPECT_EQ(ULL(0x00000000FFFFFFFF), ZigZagEncode64(LL(0xFFFFFFFF80000000))); 700 EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFE), ZigZagEncode64(LL(0x7FFFFFFFFFFFFFFF))); 701 EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFF), ZigZagEncode64(LL(0x8000000000000000))); 702 703 EXPECT_EQ( 0, ZigZagDecode64(0u)); 704 EXPECT_EQ(-1, ZigZagDecode64(1u)); 705 EXPECT_EQ( 1, ZigZagDecode64(2u)); 706 EXPECT_EQ(-2, ZigZagDecode64(3u)); 707 EXPECT_EQ(LL(0x000000003FFFFFFF), ZigZagDecode64(ULL(0x000000007FFFFFFE))); 708 EXPECT_EQ(LL(0xFFFFFFFFC0000000), ZigZagDecode64(ULL(0x000000007FFFFFFF))); 709 EXPECT_EQ(LL(0x000000007FFFFFFF), ZigZagDecode64(ULL(0x00000000FFFFFFFE))); 710 EXPECT_EQ(LL(0xFFFFFFFF80000000), ZigZagDecode64(ULL(0x00000000FFFFFFFF))); 711 EXPECT_EQ(LL(0x7FFFFFFFFFFFFFFF), ZigZagDecode64(ULL(0xFFFFFFFFFFFFFFFE))); 712 EXPECT_EQ(LL(0x8000000000000000), ZigZagDecode64(ULL(0xFFFFFFFFFFFFFFFF))); 713 714 // Some easier-to-verify round-trip tests. The inputs (other than 0, 1, -1) 715 // were chosen semi-randomly via keyboard bashing. 716 EXPECT_EQ( 0, ZigZagDecode32(ZigZagEncode32( 0))); 717 EXPECT_EQ( 1, ZigZagDecode32(ZigZagEncode32( 1))); 718 EXPECT_EQ( -1, ZigZagDecode32(ZigZagEncode32( -1))); 719 EXPECT_EQ(14927, ZigZagDecode32(ZigZagEncode32(14927))); 720 EXPECT_EQ(-3612, ZigZagDecode32(ZigZagEncode32(-3612))); 721 722 EXPECT_EQ( 0, ZigZagDecode64(ZigZagEncode64( 0))); 723 EXPECT_EQ( 1, ZigZagDecode64(ZigZagEncode64( 1))); 724 EXPECT_EQ( -1, ZigZagDecode64(ZigZagEncode64( -1))); 725 EXPECT_EQ(14927, ZigZagDecode64(ZigZagEncode64(14927))); 726 EXPECT_EQ(-3612, ZigZagDecode64(ZigZagEncode64(-3612))); 727 728 EXPECT_EQ(LL(856912304801416), ZigZagDecode64(ZigZagEncode64( 729 LL(856912304801416)))); 730 EXPECT_EQ(LL(-75123905439571256), ZigZagDecode64(ZigZagEncode64( 731 LL(-75123905439571256)))); 732 } 733 734 TEST(WireFormatTest, RepeatedScalarsDifferentTagSizes) { 735 // At one point checks would trigger when parsing repeated fixed scalar 736 // fields. 737 protobuf_unittest::TestRepeatedScalarDifferentTagSizes msg1, msg2; 738 for (int i = 0; i < 100; ++i) { 739 msg1.add_repeated_fixed32(i); 740 msg1.add_repeated_int32(i); 741 msg1.add_repeated_fixed64(i); 742 msg1.add_repeated_int64(i); 743 msg1.add_repeated_float(i); 744 msg1.add_repeated_uint64(i); 745 } 746 747 // Make sure that we have a variety of tag sizes. 748 const google::protobuf::Descriptor* desc = msg1.GetDescriptor(); 749 const google::protobuf::FieldDescriptor* field; 750 field = desc->FindFieldByName("repeated_fixed32"); 751 ASSERT_TRUE(field != NULL); 752 ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type())); 753 field = desc->FindFieldByName("repeated_int32"); 754 ASSERT_TRUE(field != NULL); 755 ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type())); 756 field = desc->FindFieldByName("repeated_fixed64"); 757 ASSERT_TRUE(field != NULL); 758 ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type())); 759 field = desc->FindFieldByName("repeated_int64"); 760 ASSERT_TRUE(field != NULL); 761 ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type())); 762 field = desc->FindFieldByName("repeated_float"); 763 ASSERT_TRUE(field != NULL); 764 ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type())); 765 field = desc->FindFieldByName("repeated_uint64"); 766 ASSERT_TRUE(field != NULL); 767 ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type())); 768 769 EXPECT_TRUE(msg2.ParseFromString(msg1.SerializeAsString())); 770 EXPECT_EQ(msg1.DebugString(), msg2.DebugString()); 771 } 772 773 TEST(WireFormatTest, CompatibleTypes) { 774 const int64 data = 0x100000000LL; 775 unittest::Int64Message msg1; 776 msg1.set_data(data); 777 string serialized; 778 msg1.SerializeToString(&serialized); 779 780 // Test int64 is compatible with bool 781 unittest::BoolMessage msg2; 782 ASSERT_TRUE(msg2.ParseFromString(serialized)); 783 ASSERT_EQ(static_cast<bool>(data), msg2.data()); 784 785 // Test int64 is compatible with uint64 786 unittest::Uint64Message msg3; 787 ASSERT_TRUE(msg3.ParseFromString(serialized)); 788 ASSERT_EQ(static_cast<uint64>(data), msg3.data()); 789 790 // Test int64 is compatible with int32 791 unittest::Int32Message msg4; 792 ASSERT_TRUE(msg4.ParseFromString(serialized)); 793 ASSERT_EQ(static_cast<int32>(data), msg4.data()); 794 795 // Test int64 is compatible with uint32 796 unittest::Uint32Message msg5; 797 ASSERT_TRUE(msg5.ParseFromString(serialized)); 798 ASSERT_EQ(static_cast<uint32>(data), msg5.data()); 799 } 800 801 class Proto3PrimitiveRepeatedWireFormatTest : public ::testing::Test { 802 protected: 803 Proto3PrimitiveRepeatedWireFormatTest() 804 : packedTestAllTypes_( 805 "\xFA\x01\x01\x01" 806 "\x82\x02\x01\x01" 807 "\x8A\x02\x01\x01" 808 "\x92\x02\x01\x01" 809 "\x9A\x02\x01\x02" 810 "\xA2\x02\x01\x02" 811 "\xAA\x02\x04\x01\x00\x00\x00" 812 "\xB2\x02\x08\x01\x00\x00\x00\x00\x00\x00\x00" 813 "\xBA\x02\x04\x01\x00\x00\x00" 814 "\xC2\x02\x08\x01\x00\x00\x00\x00\x00\x00\x00" 815 "\xCA\x02\x04\x00\x00\x80\x3f" 816 "\xD2\x02\x08\x00\x00\x00\x00\x00\x00\xf0\x3f" 817 "\xDA\x02\x01\x01" 818 "\x9A\x03\x01\x01", 819 86), 820 packedTestUnpackedTypes_( 821 "\x0A\x01\x01" 822 "\x12\x01\x01" 823 "\x1A\x01\x01" 824 "\x22\x01\x01" 825 "\x2A\x01\x02" 826 "\x32\x01\x02" 827 "\x3A\x04\x01\x00\x00\x00" 828 "\x42\x08\x01\x00\x00\x00\x00\x00\x00\x00" 829 "\x4A\x04\x01\x00\x00\x00" 830 "\x52\x08\x01\x00\x00\x00\x00\x00\x00\x00" 831 "\x5A\x04\x00\x00\x80\x3f" 832 "\x62\x08\x00\x00\x00\x00\x00\x00\xf0\x3f" 833 "\x6A\x01\x01" 834 "\x72\x01\x01", 835 72), 836 unpackedTestAllTypes_( 837 "\xF8\x01\x01" 838 "\x80\x02\x01" 839 "\x88\x02\x01" 840 "\x90\x02\x01" 841 "\x98\x02\x02" 842 "\xA0\x02\x02" 843 "\xAD\x02\x01\x00\x00\x00" 844 "\xB1\x02\x01\x00\x00\x00\x00\x00\x00\x00" 845 "\xBD\x02\x01\x00\x00\x00" 846 "\xC1\x02\x01\x00\x00\x00\x00\x00\x00\x00" 847 "\xCD\x02\x00\x00\x80\x3f" 848 "\xD1\x02\x00\x00\x00\x00\x00\x00\xf0\x3f" 849 "\xD8\x02\x01" 850 "\x98\x03\x01", 851 72), 852 unpackedTestUnpackedTypes_( 853 "\x08\x01" 854 "\x10\x01" 855 "\x18\x01" 856 "\x20\x01" 857 "\x28\x02" 858 "\x30\x02" 859 "\x3D\x01\x00\x00\x00" 860 "\x41\x01\x00\x00\x00\x00\x00\x00\x00" 861 "\x4D\x01\x00\x00\x00" 862 "\x51\x01\x00\x00\x00\x00\x00\x00\x00" 863 "\x5D\x00\x00\x80\x3f" 864 "\x61\x00\x00\x00\x00\x00\x00\xf0\x3f" 865 "\x68\x01" 866 "\x70\x01", 867 58) {} 868 template <class Proto> 869 void SetProto3PrimitiveRepeatedFields(Proto* message) { 870 message->add_repeated_int32(1); 871 message->add_repeated_int64(1); 872 message->add_repeated_uint32(1); 873 message->add_repeated_uint64(1); 874 message->add_repeated_sint32(1); 875 message->add_repeated_sint64(1); 876 message->add_repeated_fixed32(1); 877 message->add_repeated_fixed64(1); 878 message->add_repeated_sfixed32(1); 879 message->add_repeated_sfixed64(1); 880 message->add_repeated_float(1.0); 881 message->add_repeated_double(1.0); 882 message->add_repeated_bool(true); 883 message->add_repeated_nested_enum( 884 proto3_arena_unittest::TestAllTypes_NestedEnum_FOO); 885 } 886 887 template <class Proto> 888 void ExpectProto3PrimitiveRepeatedFieldsSet(const Proto& message) { 889 EXPECT_EQ(1, message.repeated_int32(0)); 890 EXPECT_EQ(1, message.repeated_int64(0)); 891 EXPECT_EQ(1, message.repeated_uint32(0)); 892 EXPECT_EQ(1, message.repeated_uint64(0)); 893 EXPECT_EQ(1, message.repeated_sint32(0)); 894 EXPECT_EQ(1, message.repeated_sint64(0)); 895 EXPECT_EQ(1, message.repeated_fixed32(0)); 896 EXPECT_EQ(1, message.repeated_fixed64(0)); 897 EXPECT_EQ(1, message.repeated_sfixed32(0)); 898 EXPECT_EQ(1, message.repeated_sfixed64(0)); 899 EXPECT_EQ(1.0, message.repeated_float(0)); 900 EXPECT_EQ(1.0, message.repeated_double(0)); 901 EXPECT_EQ(true, message.repeated_bool(0)); 902 EXPECT_EQ(proto3_arena_unittest::TestAllTypes_NestedEnum_FOO, 903 message.repeated_nested_enum(0)); 904 } 905 906 template <class Proto> 907 void TestSerialization(Proto* message, const string& expected) { 908 SetProto3PrimitiveRepeatedFields(message); 909 910 int size = message->ByteSize(); 911 912 // Serialize using the generated code. 913 string generated_data; 914 { 915 io::StringOutputStream raw_output(&generated_data); 916 io::CodedOutputStream output(&raw_output); 917 message->SerializeWithCachedSizes(&output); 918 ASSERT_FALSE(output.HadError()); 919 } 920 EXPECT_TRUE(expected == generated_data); 921 922 // Serialize using the dynamic code. 923 string dynamic_data; 924 { 925 io::StringOutputStream raw_output(&dynamic_data); 926 io::CodedOutputStream output(&raw_output); 927 WireFormat::SerializeWithCachedSizes(*message, size, &output); 928 ASSERT_FALSE(output.HadError()); 929 } 930 EXPECT_TRUE(expected == dynamic_data); 931 } 932 933 template <class Proto> 934 void TestParsing(Proto* message, const string& compatible_data) { 935 message->Clear(); 936 message->ParseFromString(compatible_data); 937 ExpectProto3PrimitiveRepeatedFieldsSet(*message); 938 939 message->Clear(); 940 io::CodedInputStream input( 941 reinterpret_cast<const uint8*>(compatible_data.data()), 942 compatible_data.size()); 943 WireFormat::ParseAndMergePartial(&input, message); 944 ExpectProto3PrimitiveRepeatedFieldsSet(*message); 945 } 946 947 const string packedTestAllTypes_; 948 const string packedTestUnpackedTypes_; 949 const string unpackedTestAllTypes_; 950 const string unpackedTestUnpackedTypes_; 951 }; 952 953 TEST_F(Proto3PrimitiveRepeatedWireFormatTest, Proto3PrimitiveRepeated) { 954 proto3_arena_unittest::TestAllTypes packed_message; 955 proto3_arena_unittest::TestUnpackedTypes unpacked_message; 956 TestSerialization(&packed_message, packedTestAllTypes_); 957 TestParsing(&packed_message, packedTestAllTypes_); 958 TestParsing(&packed_message, unpackedTestAllTypes_); 959 TestSerialization(&unpacked_message, unpackedTestUnpackedTypes_); 960 TestParsing(&unpacked_message, packedTestUnpackedTypes_); 961 TestParsing(&unpacked_message, unpackedTestUnpackedTypes_); 962 } 963 964 class WireFormatInvalidInputTest : public testing::Test { 965 protected: 966 // Make a serialized TestAllTypes in which the field optional_nested_message 967 // contains exactly the given bytes, which may be invalid. 968 string MakeInvalidEmbeddedMessage(const char* bytes, int size) { 969 const FieldDescriptor* field = 970 unittest::TestAllTypes::descriptor()->FindFieldByName( 971 "optional_nested_message"); 972 GOOGLE_CHECK(field != NULL); 973 974 string result; 975 976 { 977 io::StringOutputStream raw_output(&result); 978 io::CodedOutputStream output(&raw_output); 979 980 WireFormatLite::WriteBytes(field->number(), string(bytes, size), &output); 981 } 982 983 return result; 984 } 985 986 // Make a serialized TestAllTypes in which the field optionalgroup 987 // contains exactly the given bytes -- which may be invalid -- and 988 // possibly no end tag. 989 string MakeInvalidGroup(const char* bytes, int size, bool include_end_tag) { 990 const FieldDescriptor* field = 991 unittest::TestAllTypes::descriptor()->FindFieldByName( 992 "optionalgroup"); 993 GOOGLE_CHECK(field != NULL); 994 995 string result; 996 997 { 998 io::StringOutputStream raw_output(&result); 999 io::CodedOutputStream output(&raw_output); 1000 1001 output.WriteVarint32(WireFormat::MakeTag(field)); 1002 output.WriteString(string(bytes, size)); 1003 if (include_end_tag) { 1004 output.WriteVarint32(WireFormatLite::MakeTag( 1005 field->number(), WireFormatLite::WIRETYPE_END_GROUP)); 1006 } 1007 } 1008 1009 return result; 1010 } 1011 }; 1012 1013 TEST_F(WireFormatInvalidInputTest, InvalidSubMessage) { 1014 unittest::TestAllTypes message; 1015 1016 // Control case. 1017 EXPECT_TRUE(message.ParseFromString(MakeInvalidEmbeddedMessage("", 0))); 1018 1019 // The byte is a valid varint, but not a valid tag (zero). 1020 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\0", 1))); 1021 1022 // The byte is a malformed varint. 1023 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\200", 1))); 1024 1025 // The byte is an endgroup tag, but we aren't parsing a group. 1026 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\014", 1))); 1027 1028 // The byte is a valid varint but not a valid tag (bad wire type). 1029 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\017", 1))); 1030 } 1031 1032 TEST_F(WireFormatInvalidInputTest, InvalidGroup) { 1033 unittest::TestAllTypes message; 1034 1035 // Control case. 1036 EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true))); 1037 1038 // Missing end tag. Groups cannot end at EOF. 1039 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false))); 1040 1041 // The byte is a valid varint, but not a valid tag (zero). 1042 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false))); 1043 1044 // The byte is a malformed varint. 1045 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false))); 1046 1047 // The byte is an endgroup tag, but not the right one for this group. 1048 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false))); 1049 1050 // The byte is a valid varint but not a valid tag (bad wire type). 1051 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true))); 1052 } 1053 1054 TEST_F(WireFormatInvalidInputTest, InvalidUnknownGroup) { 1055 // Use TestEmptyMessage so that the group made by MakeInvalidGroup will not 1056 // be a known tag number. 1057 unittest::TestEmptyMessage message; 1058 1059 // Control case. 1060 EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true))); 1061 1062 // Missing end tag. Groups cannot end at EOF. 1063 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false))); 1064 1065 // The byte is a valid varint, but not a valid tag (zero). 1066 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false))); 1067 1068 // The byte is a malformed varint. 1069 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false))); 1070 1071 // The byte is an endgroup tag, but not the right one for this group. 1072 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false))); 1073 1074 // The byte is a valid varint but not a valid tag (bad wire type). 1075 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true))); 1076 } 1077 1078 TEST_F(WireFormatInvalidInputTest, InvalidStringInUnknownGroup) { 1079 // Test a bug fix: SkipMessage should fail if the message contains a string 1080 // whose length would extend beyond the message end. 1081 1082 unittest::TestAllTypes message; 1083 message.set_optional_string("foo foo foo foo"); 1084 string data; 1085 message.SerializeToString(&data); 1086 1087 // Chop some bytes off the end. 1088 data.resize(data.size() - 4); 1089 1090 // Try to skip it. Note that the bug was only present when parsing to an 1091 // UnknownFieldSet. 1092 io::ArrayInputStream raw_input(data.data(), data.size()); 1093 io::CodedInputStream coded_input(&raw_input); 1094 UnknownFieldSet unknown_fields; 1095 EXPECT_FALSE(WireFormat::SkipMessage(&coded_input, &unknown_fields)); 1096 } 1097 1098 // Test differences between string and bytes. 1099 // Value of a string type must be valid UTF-8 string. When UTF-8 1100 // validation is enabled (GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED): 1101 // WriteInvalidUTF8String: see error message. 1102 // ReadInvalidUTF8String: see error message. 1103 // WriteValidUTF8String: fine. 1104 // ReadValidUTF8String: fine. 1105 // WriteAnyBytes: fine. 1106 // ReadAnyBytes: fine. 1107 const char * kInvalidUTF8String = "Invalid UTF-8: \xA0\xB0\xC0\xD0"; 1108 // This used to be "Valid UTF-8: \x01\x02\u8C37\u6B4C", but MSVC seems to 1109 // interpret \u differently from GCC. 1110 const char * kValidUTF8String = "Valid UTF-8: \x01\x02\350\260\267\346\255\214"; 1111 1112 template<typename T> 1113 bool WriteMessage(const char *value, T *message, string *wire_buffer) { 1114 message->set_data(value); 1115 wire_buffer->clear(); 1116 message->AppendToString(wire_buffer); 1117 return (wire_buffer->size() > 0); 1118 } 1119 1120 template<typename T> 1121 bool ReadMessage(const string &wire_buffer, T *message) { 1122 return message->ParseFromArray(wire_buffer.data(), wire_buffer.size()); 1123 } 1124 1125 bool StartsWith(const string& s, const string& prefix) { 1126 return s.substr(0, prefix.length()) == prefix; 1127 } 1128 1129 class Utf8ValidationTest : public ::testing::Test { 1130 protected: 1131 Utf8ValidationTest() {} 1132 virtual ~Utf8ValidationTest() {} 1133 virtual void SetUp() { 1134 } 1135 1136 }; 1137 1138 TEST_F(Utf8ValidationTest, WriteInvalidUTF8String) { 1139 string wire_buffer; 1140 protobuf_unittest::OneString input; 1141 vector<string> errors; 1142 { 1143 ScopedMemoryLog log; 1144 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 1145 errors = log.GetMessages(ERROR); 1146 } 1147 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1148 ASSERT_EQ(1, errors.size()); 1149 EXPECT_TRUE(StartsWith(errors[0], 1150 "String field 'protobuf_unittest.OneString.data' " 1151 "contains invalid UTF-8 data when " 1152 "serializing a protocol buffer. Use the " 1153 "'bytes' type if you intend to send raw bytes.")); 1154 #else 1155 ASSERT_EQ(0, errors.size()); 1156 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1157 } 1158 1159 1160 TEST_F(Utf8ValidationTest, ReadInvalidUTF8String) { 1161 string wire_buffer; 1162 protobuf_unittest::OneString input; 1163 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 1164 protobuf_unittest::OneString output; 1165 vector<string> errors; 1166 { 1167 ScopedMemoryLog log; 1168 ReadMessage(wire_buffer, &output); 1169 errors = log.GetMessages(ERROR); 1170 } 1171 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1172 ASSERT_EQ(1, errors.size()); 1173 EXPECT_TRUE(StartsWith(errors[0], 1174 "String field 'protobuf_unittest.OneString.data' " 1175 "contains invalid UTF-8 data when " 1176 "parsing a protocol buffer. Use the " 1177 "'bytes' type if you intend to send raw bytes.")); 1178 1179 #else 1180 ASSERT_EQ(0, errors.size()); 1181 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1182 } 1183 1184 1185 TEST_F(Utf8ValidationTest, WriteValidUTF8String) { 1186 string wire_buffer; 1187 protobuf_unittest::OneString input; 1188 vector<string> errors; 1189 { 1190 ScopedMemoryLog log; 1191 WriteMessage(kValidUTF8String, &input, &wire_buffer); 1192 errors = log.GetMessages(ERROR); 1193 } 1194 ASSERT_EQ(0, errors.size()); 1195 } 1196 1197 TEST_F(Utf8ValidationTest, ReadValidUTF8String) { 1198 string wire_buffer; 1199 protobuf_unittest::OneString input; 1200 WriteMessage(kValidUTF8String, &input, &wire_buffer); 1201 protobuf_unittest::OneString output; 1202 vector<string> errors; 1203 { 1204 ScopedMemoryLog log; 1205 ReadMessage(wire_buffer, &output); 1206 errors = log.GetMessages(ERROR); 1207 } 1208 ASSERT_EQ(0, errors.size()); 1209 EXPECT_EQ(input.data(), output.data()); 1210 } 1211 1212 // Bytes: anything can pass as bytes, use invalid UTF-8 string to test 1213 TEST_F(Utf8ValidationTest, WriteArbitraryBytes) { 1214 string wire_buffer; 1215 protobuf_unittest::OneBytes input; 1216 vector<string> errors; 1217 { 1218 ScopedMemoryLog log; 1219 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 1220 errors = log.GetMessages(ERROR); 1221 } 1222 ASSERT_EQ(0, errors.size()); 1223 } 1224 1225 TEST_F(Utf8ValidationTest, ReadArbitraryBytes) { 1226 string wire_buffer; 1227 protobuf_unittest::OneBytes input; 1228 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 1229 protobuf_unittest::OneBytes output; 1230 vector<string> errors; 1231 { 1232 ScopedMemoryLog log; 1233 ReadMessage(wire_buffer, &output); 1234 errors = log.GetMessages(ERROR); 1235 } 1236 ASSERT_EQ(0, errors.size()); 1237 EXPECT_EQ(input.data(), output.data()); 1238 } 1239 1240 TEST_F(Utf8ValidationTest, ParseRepeatedString) { 1241 protobuf_unittest::MoreBytes input; 1242 input.add_data(kValidUTF8String); 1243 input.add_data(kInvalidUTF8String); 1244 input.add_data(kInvalidUTF8String); 1245 string wire_buffer = input.SerializeAsString(); 1246 1247 protobuf_unittest::MoreString output; 1248 vector<string> errors; 1249 { 1250 ScopedMemoryLog log; 1251 ReadMessage(wire_buffer, &output); 1252 errors = log.GetMessages(ERROR); 1253 } 1254 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1255 ASSERT_EQ(2, errors.size()); 1256 #else 1257 ASSERT_EQ(0, errors.size()); 1258 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1259 EXPECT_EQ(wire_buffer, output.SerializeAsString()); 1260 } 1261 1262 // Test the old VerifyUTF8String() function, which may still be called by old 1263 // generated code. 1264 TEST_F(Utf8ValidationTest, OldVerifyUTF8String) { 1265 string data(kInvalidUTF8String); 1266 1267 vector<string> errors; 1268 { 1269 ScopedMemoryLog log; 1270 WireFormat::VerifyUTF8String(data.data(), data.size(), 1271 WireFormat::SERIALIZE); 1272 errors = log.GetMessages(ERROR); 1273 } 1274 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 1275 ASSERT_EQ(1, errors.size()); 1276 EXPECT_TRUE(StartsWith(errors[0], 1277 "String field contains invalid UTF-8 data when " 1278 "serializing a protocol buffer. Use the " 1279 "'bytes' type if you intend to send raw bytes.")); 1280 #else 1281 ASSERT_EQ(0, errors.size()); 1282 #endif 1283 } 1284 1285 1286 } // namespace 1287 } // namespace internal 1288 } // namespace protobuf 1289 } // namespace google 1290