1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // http://code.google.com/p/protobuf/ 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_mset.pb.h> 42 #include <google/protobuf/test_util.h> 43 44 #include <google/protobuf/stubs/common.h> 45 #include <google/protobuf/testing/googletest.h> 46 #include <gtest/gtest.h> 47 #include <google/protobuf/stubs/stl_util-inl.h> 48 49 namespace google { 50 namespace protobuf { 51 namespace internal { 52 namespace { 53 54 TEST(WireFormatTest, EnumsInSync) { 55 // Verify that WireFormatLite::FieldType and WireFormatLite::CppType match 56 // FieldDescriptor::Type and FieldDescriptor::CppType. 57 58 EXPECT_EQ(implicit_cast<int>(FieldDescriptor::MAX_TYPE), 59 implicit_cast<int>(WireFormatLite::MAX_FIELD_TYPE)); 60 EXPECT_EQ(implicit_cast<int>(FieldDescriptor::MAX_CPPTYPE), 61 implicit_cast<int>(WireFormatLite::MAX_CPPTYPE)); 62 63 for (int i = 1; i <= WireFormatLite::MAX_FIELD_TYPE; i++) { 64 EXPECT_EQ( 65 implicit_cast<int>(FieldDescriptor::TypeToCppType( 66 static_cast<FieldDescriptor::Type>(i))), 67 implicit_cast<int>(WireFormatLite::FieldTypeToCppType( 68 static_cast<WireFormatLite::FieldType>(i)))); 69 } 70 } 71 72 TEST(WireFormatTest, MaxFieldNumber) { 73 // Make sure the max field number constant is accurate. 74 EXPECT_EQ((1 << (32 - WireFormatLite::kTagTypeBits)) - 1, 75 FieldDescriptor::kMaxNumber); 76 } 77 78 TEST(WireFormatTest, Parse) { 79 unittest::TestAllTypes source, dest; 80 string data; 81 82 // Serialize using the generated code. 83 TestUtil::SetAllFields(&source); 84 source.SerializeToString(&data); 85 86 // Parse using WireFormat. 87 io::ArrayInputStream raw_input(data.data(), data.size()); 88 io::CodedInputStream input(&raw_input); 89 WireFormat::ParseAndMergePartial(&input, &dest); 90 91 // Check. 92 TestUtil::ExpectAllFieldsSet(dest); 93 } 94 95 TEST(WireFormatTest, ParseExtensions) { 96 unittest::TestAllExtensions source, dest; 97 string data; 98 99 // Serialize using the generated code. 100 TestUtil::SetAllExtensions(&source); 101 source.SerializeToString(&data); 102 103 // Parse using WireFormat. 104 io::ArrayInputStream raw_input(data.data(), data.size()); 105 io::CodedInputStream input(&raw_input); 106 WireFormat::ParseAndMergePartial(&input, &dest); 107 108 // Check. 109 TestUtil::ExpectAllExtensionsSet(dest); 110 } 111 112 TEST(WireFormatTest, ParsePacked) { 113 unittest::TestPackedTypes source, dest; 114 string data; 115 116 // Serialize using the generated code. 117 TestUtil::SetPackedFields(&source); 118 source.SerializeToString(&data); 119 120 // Parse using WireFormat. 121 io::ArrayInputStream raw_input(data.data(), data.size()); 122 io::CodedInputStream input(&raw_input); 123 WireFormat::ParseAndMergePartial(&input, &dest); 124 125 // Check. 126 TestUtil::ExpectPackedFieldsSet(dest); 127 } 128 129 TEST(WireFormatTest, ParsePackedFromUnpacked) { 130 // Serialize using the generated code. 131 unittest::TestUnpackedTypes source; 132 TestUtil::SetUnpackedFields(&source); 133 string data = source.SerializeAsString(); 134 135 // Parse using WireFormat. 136 unittest::TestPackedTypes dest; 137 io::ArrayInputStream raw_input(data.data(), data.size()); 138 io::CodedInputStream input(&raw_input); 139 WireFormat::ParseAndMergePartial(&input, &dest); 140 141 // Check. 142 TestUtil::ExpectPackedFieldsSet(dest); 143 } 144 145 TEST(WireFormatTest, ParseUnpackedFromPacked) { 146 // Serialize using the generated code. 147 unittest::TestPackedTypes source; 148 TestUtil::SetPackedFields(&source); 149 string data = source.SerializeAsString(); 150 151 // Parse using WireFormat. 152 unittest::TestUnpackedTypes dest; 153 io::ArrayInputStream raw_input(data.data(), data.size()); 154 io::CodedInputStream input(&raw_input); 155 WireFormat::ParseAndMergePartial(&input, &dest); 156 157 // Check. 158 TestUtil::ExpectUnpackedFieldsSet(dest); 159 } 160 161 TEST(WireFormatTest, ParsePackedExtensions) { 162 unittest::TestPackedExtensions source, dest; 163 string data; 164 165 // Serialize using the generated code. 166 TestUtil::SetPackedExtensions(&source); 167 source.SerializeToString(&data); 168 169 // Parse using WireFormat. 170 io::ArrayInputStream raw_input(data.data(), data.size()); 171 io::CodedInputStream input(&raw_input); 172 WireFormat::ParseAndMergePartial(&input, &dest); 173 174 // Check. 175 TestUtil::ExpectPackedExtensionsSet(dest); 176 } 177 178 TEST(WireFormatTest, ByteSize) { 179 unittest::TestAllTypes message; 180 TestUtil::SetAllFields(&message); 181 182 EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message)); 183 message.Clear(); 184 EXPECT_EQ(0, message.ByteSize()); 185 EXPECT_EQ(0, WireFormat::ByteSize(message)); 186 } 187 188 TEST(WireFormatTest, ByteSizeExtensions) { 189 unittest::TestAllExtensions message; 190 TestUtil::SetAllExtensions(&message); 191 192 EXPECT_EQ(message.ByteSize(), 193 WireFormat::ByteSize(message)); 194 message.Clear(); 195 EXPECT_EQ(0, message.ByteSize()); 196 EXPECT_EQ(0, WireFormat::ByteSize(message)); 197 } 198 199 TEST(WireFormatTest, ByteSizePacked) { 200 unittest::TestPackedTypes message; 201 TestUtil::SetPackedFields(&message); 202 203 EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message)); 204 message.Clear(); 205 EXPECT_EQ(0, message.ByteSize()); 206 EXPECT_EQ(0, WireFormat::ByteSize(message)); 207 } 208 209 TEST(WireFormatTest, ByteSizePackedExtensions) { 210 unittest::TestPackedExtensions message; 211 TestUtil::SetPackedExtensions(&message); 212 213 EXPECT_EQ(message.ByteSize(), 214 WireFormat::ByteSize(message)); 215 message.Clear(); 216 EXPECT_EQ(0, message.ByteSize()); 217 EXPECT_EQ(0, WireFormat::ByteSize(message)); 218 } 219 220 TEST(WireFormatTest, Serialize) { 221 unittest::TestAllTypes message; 222 string generated_data; 223 string dynamic_data; 224 225 TestUtil::SetAllFields(&message); 226 int size = message.ByteSize(); 227 228 // Serialize using the generated code. 229 { 230 io::StringOutputStream raw_output(&generated_data); 231 io::CodedOutputStream output(&raw_output); 232 message.SerializeWithCachedSizes(&output); 233 ASSERT_FALSE(output.HadError()); 234 } 235 236 // Serialize using WireFormat. 237 { 238 io::StringOutputStream raw_output(&dynamic_data); 239 io::CodedOutputStream output(&raw_output); 240 WireFormat::SerializeWithCachedSizes(message, size, &output); 241 ASSERT_FALSE(output.HadError()); 242 } 243 244 // Should be the same. 245 // Don't use EXPECT_EQ here because we're comparing raw binary data and 246 // we really don't want it dumped to stdout on failure. 247 EXPECT_TRUE(dynamic_data == generated_data); 248 } 249 250 TEST(WireFormatTest, SerializeExtensions) { 251 unittest::TestAllExtensions message; 252 string generated_data; 253 string dynamic_data; 254 255 TestUtil::SetAllExtensions(&message); 256 int size = message.ByteSize(); 257 258 // Serialize using the generated code. 259 { 260 io::StringOutputStream raw_output(&generated_data); 261 io::CodedOutputStream output(&raw_output); 262 message.SerializeWithCachedSizes(&output); 263 ASSERT_FALSE(output.HadError()); 264 } 265 266 // Serialize using WireFormat. 267 { 268 io::StringOutputStream raw_output(&dynamic_data); 269 io::CodedOutputStream output(&raw_output); 270 WireFormat::SerializeWithCachedSizes(message, size, &output); 271 ASSERT_FALSE(output.HadError()); 272 } 273 274 // Should be the same. 275 // Don't use EXPECT_EQ here because we're comparing raw binary data and 276 // we really don't want it dumped to stdout on failure. 277 EXPECT_TRUE(dynamic_data == generated_data); 278 } 279 280 TEST(WireFormatTest, SerializeFieldsAndExtensions) { 281 unittest::TestFieldOrderings message; 282 string generated_data; 283 string dynamic_data; 284 285 TestUtil::SetAllFieldsAndExtensions(&message); 286 int size = message.ByteSize(); 287 288 // Serialize using the generated code. 289 { 290 io::StringOutputStream raw_output(&generated_data); 291 io::CodedOutputStream output(&raw_output); 292 message.SerializeWithCachedSizes(&output); 293 ASSERT_FALSE(output.HadError()); 294 } 295 296 // Serialize using WireFormat. 297 { 298 io::StringOutputStream raw_output(&dynamic_data); 299 io::CodedOutputStream output(&raw_output); 300 WireFormat::SerializeWithCachedSizes(message, size, &output); 301 ASSERT_FALSE(output.HadError()); 302 } 303 304 // Should be the same. 305 // Don't use EXPECT_EQ here because we're comparing raw binary data and 306 // we really don't want it dumped to stdout on failure. 307 EXPECT_TRUE(dynamic_data == generated_data); 308 309 // Should output in canonical order. 310 TestUtil::ExpectAllFieldsAndExtensionsInOrder(dynamic_data); 311 TestUtil::ExpectAllFieldsAndExtensionsInOrder(generated_data); 312 } 313 314 TEST(WireFormatTest, ParseMultipleExtensionRanges) { 315 // Make sure we can parse a message that contains multiple extensions ranges. 316 unittest::TestFieldOrderings source; 317 string data; 318 319 TestUtil::SetAllFieldsAndExtensions(&source); 320 source.SerializeToString(&data); 321 322 { 323 unittest::TestFieldOrderings dest; 324 EXPECT_TRUE(dest.ParseFromString(data)); 325 EXPECT_EQ(source.DebugString(), dest.DebugString()); 326 } 327 328 // Also test using reflection-based parsing. 329 { 330 unittest::TestFieldOrderings dest; 331 io::ArrayInputStream raw_input(data.data(), data.size()); 332 io::CodedInputStream coded_input(&raw_input); 333 EXPECT_TRUE(WireFormat::ParseAndMergePartial(&coded_input, &dest)); 334 EXPECT_EQ(source.DebugString(), dest.DebugString()); 335 } 336 } 337 338 const int kUnknownTypeId = 1550055; 339 340 TEST(WireFormatTest, SerializeMessageSet) { 341 // Set up a TestMessageSet with two known messages and an unknown one. 342 unittest::TestMessageSet message_set; 343 message_set.MutableExtension( 344 unittest::TestMessageSetExtension1::message_set_extension)->set_i(123); 345 message_set.MutableExtension( 346 unittest::TestMessageSetExtension2::message_set_extension)->set_str("foo"); 347 message_set.mutable_unknown_fields()->AddLengthDelimited( 348 kUnknownTypeId, "bar"); 349 350 string data; 351 ASSERT_TRUE(message_set.SerializeToString(&data)); 352 353 // Parse back using RawMessageSet and check the contents. 354 unittest::RawMessageSet raw; 355 ASSERT_TRUE(raw.ParseFromString(data)); 356 357 EXPECT_EQ(0, raw.unknown_fields().field_count()); 358 359 ASSERT_EQ(3, raw.item_size()); 360 EXPECT_EQ( 361 unittest::TestMessageSetExtension1::descriptor()->extension(0)->number(), 362 raw.item(0).type_id()); 363 EXPECT_EQ( 364 unittest::TestMessageSetExtension2::descriptor()->extension(0)->number(), 365 raw.item(1).type_id()); 366 EXPECT_EQ(kUnknownTypeId, raw.item(2).type_id()); 367 368 unittest::TestMessageSetExtension1 message1; 369 EXPECT_TRUE(message1.ParseFromString(raw.item(0).message())); 370 EXPECT_EQ(123, message1.i()); 371 372 unittest::TestMessageSetExtension2 message2; 373 EXPECT_TRUE(message2.ParseFromString(raw.item(1).message())); 374 EXPECT_EQ("foo", message2.str()); 375 376 EXPECT_EQ("bar", raw.item(2).message()); 377 } 378 379 TEST(WireFormatTest, SerializeMessageSetVariousWaysAreEqual) { 380 // Serialize a MessageSet to a stream and to a flat array using generated 381 // code, and also using WireFormat, and check that the results are equal. 382 // Set up a TestMessageSet with two known messages and an unknown one, as 383 // above. 384 385 unittest::TestMessageSet message_set; 386 message_set.MutableExtension( 387 unittest::TestMessageSetExtension1::message_set_extension)->set_i(123); 388 message_set.MutableExtension( 389 unittest::TestMessageSetExtension2::message_set_extension)->set_str("foo"); 390 message_set.mutable_unknown_fields()->AddLengthDelimited( 391 kUnknownTypeId, "bar"); 392 393 int size = message_set.ByteSize(); 394 EXPECT_EQ(size, message_set.GetCachedSize()); 395 ASSERT_EQ(size, WireFormat::ByteSize(message_set)); 396 397 string flat_data; 398 string stream_data; 399 string dynamic_data; 400 flat_data.resize(size); 401 stream_data.resize(size); 402 403 // Serialize to flat array 404 { 405 uint8* target = reinterpret_cast<uint8*>(string_as_array(&flat_data)); 406 uint8* end = message_set.SerializeWithCachedSizesToArray(target); 407 EXPECT_EQ(size, end - target); 408 } 409 410 // Serialize to buffer 411 { 412 io::ArrayOutputStream array_stream(string_as_array(&stream_data), size, 1); 413 io::CodedOutputStream output_stream(&array_stream); 414 message_set.SerializeWithCachedSizes(&output_stream); 415 ASSERT_FALSE(output_stream.HadError()); 416 } 417 418 // Serialize to buffer with WireFormat. 419 { 420 io::StringOutputStream string_stream(&dynamic_data); 421 io::CodedOutputStream output_stream(&string_stream); 422 WireFormat::SerializeWithCachedSizes(message_set, size, &output_stream); 423 ASSERT_FALSE(output_stream.HadError()); 424 } 425 426 EXPECT_TRUE(flat_data == stream_data); 427 EXPECT_TRUE(flat_data == dynamic_data); 428 } 429 430 TEST(WireFormatTest, ParseMessageSet) { 431 // Set up a RawMessageSet with two known messages and an unknown one. 432 unittest::RawMessageSet raw; 433 434 { 435 unittest::RawMessageSet::Item* item = raw.add_item(); 436 item->set_type_id( 437 unittest::TestMessageSetExtension1::descriptor()->extension(0)->number()); 438 unittest::TestMessageSetExtension1 message; 439 message.set_i(123); 440 message.SerializeToString(item->mutable_message()); 441 } 442 443 { 444 unittest::RawMessageSet::Item* item = raw.add_item(); 445 item->set_type_id( 446 unittest::TestMessageSetExtension2::descriptor()->extension(0)->number()); 447 unittest::TestMessageSetExtension2 message; 448 message.set_str("foo"); 449 message.SerializeToString(item->mutable_message()); 450 } 451 452 { 453 unittest::RawMessageSet::Item* item = raw.add_item(); 454 item->set_type_id(kUnknownTypeId); 455 item->set_message("bar"); 456 } 457 458 string data; 459 ASSERT_TRUE(raw.SerializeToString(&data)); 460 461 // Parse as a TestMessageSet and check the contents. 462 unittest::TestMessageSet message_set; 463 ASSERT_TRUE(message_set.ParseFromString(data)); 464 465 EXPECT_EQ(123, message_set.GetExtension( 466 unittest::TestMessageSetExtension1::message_set_extension).i()); 467 EXPECT_EQ("foo", message_set.GetExtension( 468 unittest::TestMessageSetExtension2::message_set_extension).str()); 469 470 ASSERT_EQ(1, message_set.unknown_fields().field_count()); 471 ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED, 472 message_set.unknown_fields().field(0).type()); 473 EXPECT_EQ("bar", message_set.unknown_fields().field(0).length_delimited()); 474 475 // Also parse using WireFormat. 476 unittest::TestMessageSet dynamic_message_set; 477 io::CodedInputStream input(reinterpret_cast<const uint8*>(data.data()), 478 data.size()); 479 ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &dynamic_message_set)); 480 EXPECT_EQ(message_set.DebugString(), dynamic_message_set.DebugString()); 481 } 482 483 TEST(WireFormatTest, RecursionLimit) { 484 unittest::TestRecursiveMessage message; 485 message.mutable_a()->mutable_a()->mutable_a()->mutable_a()->set_i(1); 486 string data; 487 message.SerializeToString(&data); 488 489 { 490 io::ArrayInputStream raw_input(data.data(), data.size()); 491 io::CodedInputStream input(&raw_input); 492 input.SetRecursionLimit(4); 493 unittest::TestRecursiveMessage message2; 494 EXPECT_TRUE(message2.ParseFromCodedStream(&input)); 495 } 496 497 { 498 io::ArrayInputStream raw_input(data.data(), data.size()); 499 io::CodedInputStream input(&raw_input); 500 input.SetRecursionLimit(3); 501 unittest::TestRecursiveMessage message2; 502 EXPECT_FALSE(message2.ParseFromCodedStream(&input)); 503 } 504 } 505 506 TEST(WireFormatTest, UnknownFieldRecursionLimit) { 507 unittest::TestEmptyMessage message; 508 message.mutable_unknown_fields() 509 ->AddGroup(1234) 510 ->AddGroup(1234) 511 ->AddGroup(1234) 512 ->AddGroup(1234) 513 ->AddVarint(1234, 123); 514 string data; 515 message.SerializeToString(&data); 516 517 { 518 io::ArrayInputStream raw_input(data.data(), data.size()); 519 io::CodedInputStream input(&raw_input); 520 input.SetRecursionLimit(4); 521 unittest::TestEmptyMessage message2; 522 EXPECT_TRUE(message2.ParseFromCodedStream(&input)); 523 } 524 525 { 526 io::ArrayInputStream raw_input(data.data(), data.size()); 527 io::CodedInputStream input(&raw_input); 528 input.SetRecursionLimit(3); 529 unittest::TestEmptyMessage message2; 530 EXPECT_FALSE(message2.ParseFromCodedStream(&input)); 531 } 532 } 533 534 TEST(WireFormatTest, ZigZag) { 535 // avoid line-wrapping 536 #define LL(x) GOOGLE_LONGLONG(x) 537 #define ULL(x) GOOGLE_ULONGLONG(x) 538 #define ZigZagEncode32(x) WireFormatLite::ZigZagEncode32(x) 539 #define ZigZagDecode32(x) WireFormatLite::ZigZagDecode32(x) 540 #define ZigZagEncode64(x) WireFormatLite::ZigZagEncode64(x) 541 #define ZigZagDecode64(x) WireFormatLite::ZigZagDecode64(x) 542 543 EXPECT_EQ(0u, ZigZagEncode32( 0)); 544 EXPECT_EQ(1u, ZigZagEncode32(-1)); 545 EXPECT_EQ(2u, ZigZagEncode32( 1)); 546 EXPECT_EQ(3u, ZigZagEncode32(-2)); 547 EXPECT_EQ(0x7FFFFFFEu, ZigZagEncode32(0x3FFFFFFF)); 548 EXPECT_EQ(0x7FFFFFFFu, ZigZagEncode32(0xC0000000)); 549 EXPECT_EQ(0xFFFFFFFEu, ZigZagEncode32(0x7FFFFFFF)); 550 EXPECT_EQ(0xFFFFFFFFu, ZigZagEncode32(0x80000000)); 551 552 EXPECT_EQ( 0, ZigZagDecode32(0u)); 553 EXPECT_EQ(-1, ZigZagDecode32(1u)); 554 EXPECT_EQ( 1, ZigZagDecode32(2u)); 555 EXPECT_EQ(-2, ZigZagDecode32(3u)); 556 EXPECT_EQ(0x3FFFFFFF, ZigZagDecode32(0x7FFFFFFEu)); 557 EXPECT_EQ(0xC0000000, ZigZagDecode32(0x7FFFFFFFu)); 558 EXPECT_EQ(0x7FFFFFFF, ZigZagDecode32(0xFFFFFFFEu)); 559 EXPECT_EQ(0x80000000, ZigZagDecode32(0xFFFFFFFFu)); 560 561 EXPECT_EQ(0u, ZigZagEncode64( 0)); 562 EXPECT_EQ(1u, ZigZagEncode64(-1)); 563 EXPECT_EQ(2u, ZigZagEncode64( 1)); 564 EXPECT_EQ(3u, ZigZagEncode64(-2)); 565 EXPECT_EQ(ULL(0x000000007FFFFFFE), ZigZagEncode64(LL(0x000000003FFFFFFF))); 566 EXPECT_EQ(ULL(0x000000007FFFFFFF), ZigZagEncode64(LL(0xFFFFFFFFC0000000))); 567 EXPECT_EQ(ULL(0x00000000FFFFFFFE), ZigZagEncode64(LL(0x000000007FFFFFFF))); 568 EXPECT_EQ(ULL(0x00000000FFFFFFFF), ZigZagEncode64(LL(0xFFFFFFFF80000000))); 569 EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFE), ZigZagEncode64(LL(0x7FFFFFFFFFFFFFFF))); 570 EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFF), ZigZagEncode64(LL(0x8000000000000000))); 571 572 EXPECT_EQ( 0, ZigZagDecode64(0u)); 573 EXPECT_EQ(-1, ZigZagDecode64(1u)); 574 EXPECT_EQ( 1, ZigZagDecode64(2u)); 575 EXPECT_EQ(-2, ZigZagDecode64(3u)); 576 EXPECT_EQ(LL(0x000000003FFFFFFF), ZigZagDecode64(ULL(0x000000007FFFFFFE))); 577 EXPECT_EQ(LL(0xFFFFFFFFC0000000), ZigZagDecode64(ULL(0x000000007FFFFFFF))); 578 EXPECT_EQ(LL(0x000000007FFFFFFF), ZigZagDecode64(ULL(0x00000000FFFFFFFE))); 579 EXPECT_EQ(LL(0xFFFFFFFF80000000), ZigZagDecode64(ULL(0x00000000FFFFFFFF))); 580 EXPECT_EQ(LL(0x7FFFFFFFFFFFFFFF), ZigZagDecode64(ULL(0xFFFFFFFFFFFFFFFE))); 581 EXPECT_EQ(LL(0x8000000000000000), ZigZagDecode64(ULL(0xFFFFFFFFFFFFFFFF))); 582 583 // Some easier-to-verify round-trip tests. The inputs (other than 0, 1, -1) 584 // were chosen semi-randomly via keyboard bashing. 585 EXPECT_EQ( 0, ZigZagDecode32(ZigZagEncode32( 0))); 586 EXPECT_EQ( 1, ZigZagDecode32(ZigZagEncode32( 1))); 587 EXPECT_EQ( -1, ZigZagDecode32(ZigZagEncode32( -1))); 588 EXPECT_EQ(14927, ZigZagDecode32(ZigZagEncode32(14927))); 589 EXPECT_EQ(-3612, ZigZagDecode32(ZigZagEncode32(-3612))); 590 591 EXPECT_EQ( 0, ZigZagDecode64(ZigZagEncode64( 0))); 592 EXPECT_EQ( 1, ZigZagDecode64(ZigZagEncode64( 1))); 593 EXPECT_EQ( -1, ZigZagDecode64(ZigZagEncode64( -1))); 594 EXPECT_EQ(14927, ZigZagDecode64(ZigZagEncode64(14927))); 595 EXPECT_EQ(-3612, ZigZagDecode64(ZigZagEncode64(-3612))); 596 597 EXPECT_EQ(LL(856912304801416), ZigZagDecode64(ZigZagEncode64( 598 LL(856912304801416)))); 599 EXPECT_EQ(LL(-75123905439571256), ZigZagDecode64(ZigZagEncode64( 600 LL(-75123905439571256)))); 601 } 602 603 TEST(WireFormatTest, RepeatedScalarsDifferentTagSizes) { 604 // At one point checks would trigger when parsing repeated fixed scalar 605 // fields. 606 protobuf_unittest::TestRepeatedScalarDifferentTagSizes msg1, msg2; 607 for (int i = 0; i < 100; ++i) { 608 msg1.add_repeated_fixed32(i); 609 msg1.add_repeated_int32(i); 610 msg1.add_repeated_fixed64(i); 611 msg1.add_repeated_int64(i); 612 msg1.add_repeated_float(i); 613 msg1.add_repeated_uint64(i); 614 } 615 616 // Make sure that we have a variety of tag sizes. 617 const google::protobuf::Descriptor* desc = msg1.GetDescriptor(); 618 const google::protobuf::FieldDescriptor* field; 619 field = desc->FindFieldByName("repeated_fixed32"); 620 ASSERT_TRUE(field != NULL); 621 ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type())); 622 field = desc->FindFieldByName("repeated_int32"); 623 ASSERT_TRUE(field != NULL); 624 ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type())); 625 field = desc->FindFieldByName("repeated_fixed64"); 626 ASSERT_TRUE(field != NULL); 627 ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type())); 628 field = desc->FindFieldByName("repeated_int64"); 629 ASSERT_TRUE(field != NULL); 630 ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type())); 631 field = desc->FindFieldByName("repeated_float"); 632 ASSERT_TRUE(field != NULL); 633 ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type())); 634 field = desc->FindFieldByName("repeated_uint64"); 635 ASSERT_TRUE(field != NULL); 636 ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type())); 637 638 EXPECT_TRUE(msg2.ParseFromString(msg1.SerializeAsString())); 639 EXPECT_EQ(msg1.DebugString(), msg2.DebugString()); 640 } 641 642 class WireFormatInvalidInputTest : public testing::Test { 643 protected: 644 // Make a serialized TestAllTypes in which the field optional_nested_message 645 // contains exactly the given bytes, which may be invalid. 646 string MakeInvalidEmbeddedMessage(const char* bytes, int size) { 647 const FieldDescriptor* field = 648 unittest::TestAllTypes::descriptor()->FindFieldByName( 649 "optional_nested_message"); 650 GOOGLE_CHECK(field != NULL); 651 652 string result; 653 654 { 655 io::StringOutputStream raw_output(&result); 656 io::CodedOutputStream output(&raw_output); 657 658 WireFormatLite::WriteBytes(field->number(), string(bytes, size), &output); 659 } 660 661 return result; 662 } 663 664 // Make a serialized TestAllTypes in which the field optionalgroup 665 // contains exactly the given bytes -- which may be invalid -- and 666 // possibly no end tag. 667 string MakeInvalidGroup(const char* bytes, int size, bool include_end_tag) { 668 const FieldDescriptor* field = 669 unittest::TestAllTypes::descriptor()->FindFieldByName( 670 "optionalgroup"); 671 GOOGLE_CHECK(field != NULL); 672 673 string result; 674 675 { 676 io::StringOutputStream raw_output(&result); 677 io::CodedOutputStream output(&raw_output); 678 679 output.WriteVarint32(WireFormat::MakeTag(field)); 680 output.WriteString(string(bytes, size)); 681 if (include_end_tag) { 682 output.WriteVarint32(WireFormatLite::MakeTag( 683 field->number(), WireFormatLite::WIRETYPE_END_GROUP)); 684 } 685 } 686 687 return result; 688 } 689 }; 690 691 TEST_F(WireFormatInvalidInputTest, InvalidSubMessage) { 692 unittest::TestAllTypes message; 693 694 // Control case. 695 EXPECT_TRUE(message.ParseFromString(MakeInvalidEmbeddedMessage("", 0))); 696 697 // The byte is a valid varint, but not a valid tag (zero). 698 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\0", 1))); 699 700 // The byte is a malformed varint. 701 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\200", 1))); 702 703 // The byte is an endgroup tag, but we aren't parsing a group. 704 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\014", 1))); 705 706 // The byte is a valid varint but not a valid tag (bad wire type). 707 EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\017", 1))); 708 } 709 710 TEST_F(WireFormatInvalidInputTest, InvalidGroup) { 711 unittest::TestAllTypes message; 712 713 // Control case. 714 EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true))); 715 716 // Missing end tag. Groups cannot end at EOF. 717 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false))); 718 719 // The byte is a valid varint, but not a valid tag (zero). 720 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false))); 721 722 // The byte is a malformed varint. 723 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false))); 724 725 // The byte is an endgroup tag, but not the right one for this group. 726 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false))); 727 728 // The byte is a valid varint but not a valid tag (bad wire type). 729 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true))); 730 } 731 732 TEST_F(WireFormatInvalidInputTest, InvalidUnknownGroup) { 733 // Use TestEmptyMessage so that the group made by MakeInvalidGroup will not 734 // be a known tag number. 735 unittest::TestEmptyMessage message; 736 737 // Control case. 738 EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true))); 739 740 // Missing end tag. Groups cannot end at EOF. 741 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false))); 742 743 // The byte is a valid varint, but not a valid tag (zero). 744 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false))); 745 746 // The byte is a malformed varint. 747 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false))); 748 749 // The byte is an endgroup tag, but not the right one for this group. 750 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false))); 751 752 // The byte is a valid varint but not a valid tag (bad wire type). 753 EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true))); 754 } 755 756 TEST_F(WireFormatInvalidInputTest, InvalidStringInUnknownGroup) { 757 // Test a bug fix: SkipMessage should fail if the message contains a string 758 // whose length would extend beyond the message end. 759 760 unittest::TestAllTypes message; 761 message.set_optional_string("foo foo foo foo"); 762 string data; 763 message.SerializeToString(&data); 764 765 // Chop some bytes off the end. 766 data.resize(data.size() - 4); 767 768 // Try to skip it. Note that the bug was only present when parsing to an 769 // UnknownFieldSet. 770 io::ArrayInputStream raw_input(data.data(), data.size()); 771 io::CodedInputStream coded_input(&raw_input); 772 UnknownFieldSet unknown_fields; 773 EXPECT_FALSE(WireFormat::SkipMessage(&coded_input, &unknown_fields)); 774 } 775 776 // Test differences between string and bytes. 777 // Value of a string type must be valid UTF-8 string. When UTF-8 778 // validation is enabled (GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED): 779 // WriteInvalidUTF8String: see error message. 780 // ReadInvalidUTF8String: see error message. 781 // WriteValidUTF8String: fine. 782 // ReadValidUTF8String: fine. 783 // WriteAnyBytes: fine. 784 // ReadAnyBytes: fine. 785 const char * kInvalidUTF8String = "Invalid UTF-8: \xA0\xB0\xC0\xD0"; 786 // This used to be "Valid UTF-8: \x01\x02\u8C37\u6B4C", but MSVC seems to 787 // interpret \u differently from GCC. 788 const char * kValidUTF8String = "Valid UTF-8: \x01\x02\350\260\267\346\255\214"; 789 790 template<typename T> 791 bool WriteMessage(const char *value, T *message, string *wire_buffer) { 792 message->set_data(value); 793 wire_buffer->clear(); 794 message->AppendToString(wire_buffer); 795 return (wire_buffer->size() > 0); 796 } 797 798 template<typename T> 799 bool ReadMessage(const string &wire_buffer, T *message) { 800 return message->ParseFromArray(wire_buffer.data(), wire_buffer.size()); 801 } 802 803 TEST(Utf8ValidationTest, WriteInvalidUTF8String) { 804 string wire_buffer; 805 protobuf_unittest::OneString input; 806 vector<string> errors; 807 { 808 ScopedMemoryLog log; 809 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 810 errors = log.GetMessages(ERROR); 811 } 812 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 813 ASSERT_EQ(1, errors.size()); 814 EXPECT_EQ("Encountered string containing invalid UTF-8 data while " 815 "serializing protocol buffer. Strings must contain only UTF-8; " 816 "use the 'bytes' type for raw bytes.", 817 errors[0]); 818 819 #else 820 ASSERT_EQ(0, errors.size()); 821 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 822 } 823 824 TEST(Utf8ValidationTest, ReadInvalidUTF8String) { 825 string wire_buffer; 826 protobuf_unittest::OneString input; 827 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 828 protobuf_unittest::OneString output; 829 vector<string> errors; 830 { 831 ScopedMemoryLog log; 832 ReadMessage(wire_buffer, &output); 833 errors = log.GetMessages(ERROR); 834 } 835 #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 836 ASSERT_EQ(1, errors.size()); 837 EXPECT_EQ("Encountered string containing invalid UTF-8 data while " 838 "parsing protocol buffer. Strings must contain only UTF-8; " 839 "use the 'bytes' type for raw bytes.", 840 errors[0]); 841 842 #else 843 ASSERT_EQ(0, errors.size()); 844 #endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED 845 } 846 847 TEST(Utf8ValidationTest, WriteValidUTF8String) { 848 string wire_buffer; 849 protobuf_unittest::OneString input; 850 vector<string> errors; 851 { 852 ScopedMemoryLog log; 853 WriteMessage(kValidUTF8String, &input, &wire_buffer); 854 errors = log.GetMessages(ERROR); 855 } 856 ASSERT_EQ(0, errors.size()); 857 } 858 859 TEST(Utf8ValidationTest, ReadValidUTF8String) { 860 string wire_buffer; 861 protobuf_unittest::OneString input; 862 WriteMessage(kValidUTF8String, &input, &wire_buffer); 863 protobuf_unittest::OneString output; 864 vector<string> errors; 865 { 866 ScopedMemoryLog log; 867 ReadMessage(wire_buffer, &output); 868 errors = log.GetMessages(ERROR); 869 } 870 ASSERT_EQ(0, errors.size()); 871 EXPECT_EQ(input.data(), output.data()); 872 } 873 874 // Bytes: anything can pass as bytes, use invalid UTF-8 string to test 875 TEST(Utf8ValidationTest, WriteArbitraryBytes) { 876 string wire_buffer; 877 protobuf_unittest::OneBytes input; 878 vector<string> errors; 879 { 880 ScopedMemoryLog log; 881 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 882 errors = log.GetMessages(ERROR); 883 } 884 ASSERT_EQ(0, errors.size()); 885 } 886 887 TEST(Utf8ValidationTest, ReadArbitraryBytes) { 888 string wire_buffer; 889 protobuf_unittest::OneBytes input; 890 WriteMessage(kInvalidUTF8String, &input, &wire_buffer); 891 protobuf_unittest::OneBytes output; 892 vector<string> errors; 893 { 894 ScopedMemoryLog log; 895 ReadMessage(wire_buffer, &output); 896 errors = log.GetMessages(ERROR); 897 } 898 ASSERT_EQ(0, errors.size()); 899 EXPECT_EQ(input.data(), output.data()); 900 } 901 902 } // namespace 903 } // namespace internal 904 } // namespace protobuf 905 } // namespace google 906