| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 unittest::TestMessageSetExtension1::message_set_extension, | 198 unittest::TestMessageSetExtension1::message_set_extension, |
| 199 extension); | 199 extension); |
| 200 message.ClearExtension( | 200 message.ClearExtension( |
| 201 unittest::TestMessageSetExtension1::message_set_extension); | 201 unittest::TestMessageSetExtension1::message_set_extension); |
| 202 released_extension = message.ReleaseExtension( | 202 released_extension = message.ReleaseExtension( |
| 203 unittest::TestMessageSetExtension1::message_set_extension); | 203 unittest::TestMessageSetExtension1::message_set_extension); |
| 204 EXPECT_TRUE(released_extension != NULL); | 204 EXPECT_TRUE(released_extension != NULL); |
| 205 delete released_extension; | 205 delete released_extension; |
| 206 } | 206 } |
| 207 | 207 |
| 208 TEST(ExtensionSetTest, ArenaUnsafeArenaSetAllocatedAndRelease) { |
| 209 ::google::protobuf::Arena arena; |
| 210 unittest::TestAllExtensions* message = |
| 211 ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&are
na); |
| 212 unittest::ForeignMessage extension; |
| 213 message->UnsafeArenaSetAllocatedExtension( |
| 214 unittest::optional_foreign_message_extension, |
| 215 &extension); |
| 216 // No copy when set. |
| 217 unittest::ForeignMessage* mutable_extension = |
| 218 message->MutableExtension(unittest::optional_foreign_message_extension); |
| 219 EXPECT_EQ(&extension, mutable_extension); |
| 220 // No copy when unsafe released. |
| 221 unittest::ForeignMessage* released_extension = |
| 222 message->UnsafeArenaReleaseExtension( |
| 223 unittest::optional_foreign_message_extension); |
| 224 EXPECT_EQ(&extension, released_extension); |
| 225 EXPECT_FALSE(message->HasExtension( |
| 226 unittest::optional_foreign_message_extension)); |
| 227 // Set the ownership back and let the destructors run. It should not take |
| 228 // ownership, so this should not crash. |
| 229 message->UnsafeArenaSetAllocatedExtension( |
| 230 unittest::optional_foreign_message_extension, |
| 231 &extension); |
| 232 } |
| 233 |
| 234 TEST(ExtensionSetTest, UnsafeArenaSetAllocatedAndRelease) { |
| 235 unittest::TestAllExtensions message; |
| 236 unittest::ForeignMessage* extension = new unittest::ForeignMessage(); |
| 237 message.UnsafeArenaSetAllocatedExtension( |
| 238 unittest::optional_foreign_message_extension, |
| 239 extension); |
| 240 // No copy when set. |
| 241 unittest::ForeignMessage* mutable_extension = |
| 242 message.MutableExtension(unittest::optional_foreign_message_extension); |
| 243 EXPECT_EQ(extension, mutable_extension); |
| 244 // No copy when unsafe released. |
| 245 unittest::ForeignMessage* released_extension = |
| 246 message.UnsafeArenaReleaseExtension( |
| 247 unittest::optional_foreign_message_extension); |
| 248 EXPECT_EQ(extension, released_extension); |
| 249 EXPECT_FALSE(message.HasExtension( |
| 250 unittest::optional_foreign_message_extension)); |
| 251 // Set the ownership back and let the destructors run. It should take |
| 252 // ownership, so this should not leak. |
| 253 message.UnsafeArenaSetAllocatedExtension( |
| 254 unittest::optional_foreign_message_extension, |
| 255 extension); |
| 256 } |
| 257 |
| 258 TEST(ExtensionSetTest, ArenaUnsafeArenaReleaseOfHeapAlloc) { |
| 259 ::google::protobuf::Arena arena; |
| 260 unittest::TestAllExtensions* message = |
| 261 ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&are
na); |
| 262 unittest::ForeignMessage* extension = new unittest::ForeignMessage; |
| 263 message->SetAllocatedExtension( |
| 264 unittest::optional_foreign_message_extension, |
| 265 extension); |
| 266 // The arena should maintain ownership of the heap allocated proto because we |
| 267 // used UnsafeArenaReleaseExtension. The leak checker will ensure this. |
| 268 unittest::ForeignMessage* released_extension = |
| 269 message->UnsafeArenaReleaseExtension( |
| 270 unittest::optional_foreign_message_extension); |
| 271 EXPECT_EQ(extension, released_extension); |
| 272 EXPECT_FALSE(message->HasExtension( |
| 273 unittest::optional_foreign_message_extension)); |
| 274 } |
| 275 |
| 208 | 276 |
| 209 TEST(ExtensionSetTest, CopyFrom) { | 277 TEST(ExtensionSetTest, CopyFrom) { |
| 210 unittest::TestAllExtensions message1, message2; | 278 unittest::TestAllExtensions message1, message2; |
| 211 | 279 |
| 212 TestUtil::SetAllExtensions(&message1); | 280 TestUtil::SetAllExtensions(&message1); |
| 213 message2.CopyFrom(message1); | 281 message2.CopyFrom(message1); |
| 214 TestUtil::ExpectAllExtensionsSet(message2); | 282 TestUtil::ExpectAllExtensionsSet(message2); |
| 215 message2.CopyFrom(message1); // exercise copy when fields already exist | 283 message2.CopyFrom(message1); // exercise copy when fields already exist |
| 216 TestUtil::ExpectAllExtensionsSet(message2); | 284 TestUtil::ExpectAllExtensionsSet(message2); |
| 217 } | 285 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 TestUtil::ExpectAllExtensionsSet(message); | 324 TestUtil::ExpectAllExtensionsSet(message); |
| 257 message.Swap(&message); | 325 message.Swap(&message); |
| 258 TestUtil::ExpectAllExtensionsSet(message); | 326 TestUtil::ExpectAllExtensionsSet(message); |
| 259 } | 327 } |
| 260 | 328 |
| 261 TEST(ExtensionSetTest, SwapExtension) { | 329 TEST(ExtensionSetTest, SwapExtension) { |
| 262 unittest::TestAllExtensions message1; | 330 unittest::TestAllExtensions message1; |
| 263 unittest::TestAllExtensions message2; | 331 unittest::TestAllExtensions message2; |
| 264 | 332 |
| 265 TestUtil::SetAllExtensions(&message1); | 333 TestUtil::SetAllExtensions(&message1); |
| 266 vector<const FieldDescriptor*> fields; | 334 std::vector<const FieldDescriptor*> fields; |
| 267 | 335 |
| 268 // Swap empty fields. | 336 // Swap empty fields. |
| 269 const Reflection* reflection = message1.GetReflection(); | 337 const Reflection* reflection = message1.GetReflection(); |
| 270 reflection->SwapFields(&message1, &message2, fields); | 338 reflection->SwapFields(&message1, &message2, fields); |
| 271 TestUtil::ExpectAllExtensionsSet(message1); | 339 TestUtil::ExpectAllExtensionsSet(message1); |
| 272 TestUtil::ExpectExtensionsClear(message2); | 340 TestUtil::ExpectExtensionsClear(message2); |
| 273 | 341 |
| 274 // Swap two extensions. | 342 // Swap two extensions. |
| 275 fields.push_back( | 343 fields.push_back( |
| 276 reflection->FindKnownExtensionByNumber(12)); | 344 reflection->FindKnownExtensionByNumber(12)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 288 } | 356 } |
| 289 | 357 |
| 290 TEST(ExtensionSetTest, SwapExtensionWithEmpty) { | 358 TEST(ExtensionSetTest, SwapExtensionWithEmpty) { |
| 291 unittest::TestAllExtensions message1; | 359 unittest::TestAllExtensions message1; |
| 292 unittest::TestAllExtensions message2; | 360 unittest::TestAllExtensions message2; |
| 293 unittest::TestAllExtensions message3; | 361 unittest::TestAllExtensions message3; |
| 294 | 362 |
| 295 TestUtil::SetAllExtensions(&message3); | 363 TestUtil::SetAllExtensions(&message3); |
| 296 | 364 |
| 297 const Reflection* reflection = message3.GetReflection(); | 365 const Reflection* reflection = message3.GetReflection(); |
| 298 vector<const FieldDescriptor*> fields; | 366 std::vector<const FieldDescriptor*> fields; |
| 299 reflection->ListFields(message3, &fields); | 367 reflection->ListFields(message3, &fields); |
| 300 | 368 |
| 301 reflection->SwapFields(&message1, &message2, fields); | 369 reflection->SwapFields(&message1, &message2, fields); |
| 302 | 370 |
| 303 TestUtil::ExpectExtensionsClear(message1); | 371 TestUtil::ExpectExtensionsClear(message1); |
| 304 TestUtil::ExpectExtensionsClear(message2); | 372 TestUtil::ExpectExtensionsClear(message2); |
| 305 } | 373 } |
| 306 | 374 |
| 307 TEST(ExtensionSetTest, SwapExtensionBothFull) { | 375 TEST(ExtensionSetTest, SwapExtensionBothFull) { |
| 308 unittest::TestAllExtensions message1; | 376 unittest::TestAllExtensions message1; |
| 309 unittest::TestAllExtensions message2; | 377 unittest::TestAllExtensions message2; |
| 310 | 378 |
| 311 TestUtil::SetAllExtensions(&message1); | 379 TestUtil::SetAllExtensions(&message1); |
| 312 TestUtil::SetAllExtensions(&message2); | 380 TestUtil::SetAllExtensions(&message2); |
| 313 | 381 |
| 314 const Reflection* reflection = message1.GetReflection(); | 382 const Reflection* reflection = message1.GetReflection(); |
| 315 vector<const FieldDescriptor*> fields; | 383 std::vector<const FieldDescriptor*> fields; |
| 316 reflection->ListFields(message1, &fields); | 384 reflection->ListFields(message1, &fields); |
| 317 | 385 |
| 318 reflection->SwapFields(&message1, &message2, fields); | 386 reflection->SwapFields(&message1, &message2, fields); |
| 319 | 387 |
| 320 TestUtil::ExpectAllExtensionsSet(message1); | 388 TestUtil::ExpectAllExtensionsSet(message1); |
| 321 TestUtil::ExpectAllExtensionsSet(message2); | 389 TestUtil::ExpectAllExtensionsSet(message2); |
| 322 } | 390 } |
| 323 | 391 |
| 324 TEST(ExtensionSetTest, ArenaSetAllExtension) { | 392 TEST(ExtensionSetTest, ArenaSetAllExtension) { |
| 325 ::google::protobuf::Arena arena1; | 393 ::google::protobuf::Arena arena1; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 | 483 |
| 416 unittest::TestAllExtensions* message1 = | 484 unittest::TestAllExtensions* message1 = |
| 417 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); | 485 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); |
| 418 unittest::TestAllExtensions* message2 = | 486 unittest::TestAllExtensions* message2 = |
| 419 Arena::CreateMessage<unittest::TestAllExtensions>(arena2); | 487 Arena::CreateMessage<unittest::TestAllExtensions>(arena2); |
| 420 | 488 |
| 421 TestUtil::SetAllExtensions(message1); | 489 TestUtil::SetAllExtensions(message1); |
| 422 TestUtil::SetAllExtensions(message2); | 490 TestUtil::SetAllExtensions(message2); |
| 423 | 491 |
| 424 const Reflection* reflection = message1->GetReflection(); | 492 const Reflection* reflection = message1->GetReflection(); |
| 425 vector<const FieldDescriptor*> fields; | 493 std::vector<const FieldDescriptor*> fields; |
| 426 reflection->ListFields(*message1, &fields); | 494 reflection->ListFields(*message1, &fields); |
| 427 reflection->SwapFields(message1, message2, fields); | 495 reflection->SwapFields(message1, message2, fields); |
| 428 TestUtil::ExpectAllExtensionsSet(*message1); | 496 TestUtil::ExpectAllExtensionsSet(*message1); |
| 429 TestUtil::ExpectAllExtensionsSet(*message2); | 497 TestUtil::ExpectAllExtensionsSet(*message2); |
| 430 delete arena2; | 498 delete arena2; |
| 431 TestUtil::ExpectAllExtensionsSet(*message1); | 499 TestUtil::ExpectAllExtensionsSet(*message1); |
| 432 } | 500 } |
| 433 | 501 |
| 434 TEST(ExtensionSetTest, SwapExtensionWithSelf) { | 502 TEST(ExtensionSetTest, SwapExtensionWithSelf) { |
| 435 unittest::TestAllExtensions message1; | 503 unittest::TestAllExtensions message1; |
| 436 | 504 |
| 437 TestUtil::SetAllExtensions(&message1); | 505 TestUtil::SetAllExtensions(&message1); |
| 438 | 506 |
| 439 vector<const FieldDescriptor*> fields; | 507 std::vector<const FieldDescriptor*> fields; |
| 440 const Reflection* reflection = message1.GetReflection(); | 508 const Reflection* reflection = message1.GetReflection(); |
| 441 reflection->ListFields(message1, &fields); | 509 reflection->ListFields(message1, &fields); |
| 442 reflection->SwapFields(&message1, &message1, fields); | 510 reflection->SwapFields(&message1, &message1, fields); |
| 443 | 511 |
| 444 TestUtil::ExpectAllExtensionsSet(message1); | 512 TestUtil::ExpectAllExtensionsSet(message1); |
| 445 } | 513 } |
| 446 | 514 |
| 447 TEST(ExtensionSetTest, SerializationToArray) { | 515 TEST(ExtensionSetTest, SerializationToArray) { |
| 448 // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire | 516 // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire |
| 449 // compatibility of extensions. | 517 // compatibility of extensions. |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \ | 789 EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \ |
| 722 message.AddExtension(unittest::repeated_##type##_extension, value); \ | 790 message.AddExtension(unittest::repeated_##type##_extension, value); \ |
| 723 message.AddExtension(unittest::repeated_##type##_extension, value); \ | 791 message.AddExtension(unittest::repeated_##type##_extension, value); \ |
| 724 EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type; \ | 792 EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type; \ |
| 725 message.ClearExtension(unittest::repeated_##type##_extension); \ | 793 message.ClearExtension(unittest::repeated_##type##_extension); \ |
| 726 for (int i = 0; i < 16; ++i) { \ | 794 for (int i = 0; i < 16; ++i) { \ |
| 727 message.AddExtension(unittest::repeated_##type##_extension, value); \ | 795 message.AddExtension(unittest::repeated_##type##_extension, value); \ |
| 728 } \ | 796 } \ |
| 729 int expected_size = sizeof(cpptype) * (16 - \ | 797 int expected_size = sizeof(cpptype) * (16 - \ |
| 730 kMinRepeatedFieldAllocationSize) + empty_repeated_field_size; \ | 798 kMinRepeatedFieldAllocationSize) + empty_repeated_field_size; \ |
| 731 EXPECT_EQ(expected_size, message.SpaceUsed()) << #type; \ | 799 EXPECT_LE(expected_size, message.SpaceUsed()) << #type; \ |
| 732 } while (0) | 800 } while (0) |
| 733 | 801 |
| 734 TEST_REPEATED_EXTENSIONS_SPACE_USED(int32 , int32 , 101); | 802 TEST_REPEATED_EXTENSIONS_SPACE_USED(int32 , int32 , 101); |
| 735 TEST_REPEATED_EXTENSIONS_SPACE_USED(int64 , int64 , 102); | 803 TEST_REPEATED_EXTENSIONS_SPACE_USED(int64 , int64 , 102); |
| 736 TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32 , uint32, 103); | 804 TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32 , uint32, 103); |
| 737 TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64 , uint64, 104); | 805 TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64 , uint64, 104); |
| 738 TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32 , int32 , 105); | 806 TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32 , int32 , 105); |
| 739 TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64 , int64 , 106); | 807 TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64 , int64 , 106); |
| 740 TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32 , uint32, 107); | 808 TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32 , uint32, 107); |
| 741 TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64 , uint64, 108); | 809 TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64 , uint64, 108); |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1198 const Message* prototype = | 1266 const Message* prototype = |
| 1199 dynamic_factory.GetPrototype(dynamic_message_extension->message_type()); | 1267 dynamic_factory.GetPrototype(dynamic_message_extension->message_type()); |
| 1200 EXPECT_EQ(prototype, &sub_message); | 1268 EXPECT_EQ(prototype, &sub_message); |
| 1201 } | 1269 } |
| 1202 } | 1270 } |
| 1203 | 1271 |
| 1204 } // namespace | 1272 } // namespace |
| 1205 } // namespace internal | 1273 } // namespace internal |
| 1206 } // namespace protobuf | 1274 } // namespace protobuf |
| 1207 } // namespace google | 1275 } // namespace google |
| OLD | NEW |