| 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 | |
| 276 | 208 |
| 277 TEST(ExtensionSetTest, CopyFrom) { | 209 TEST(ExtensionSetTest, CopyFrom) { |
| 278 unittest::TestAllExtensions message1, message2; | 210 unittest::TestAllExtensions message1, message2; |
| 279 | 211 |
| 280 TestUtil::SetAllExtensions(&message1); | 212 TestUtil::SetAllExtensions(&message1); |
| 281 message2.CopyFrom(message1); | 213 message2.CopyFrom(message1); |
| 282 TestUtil::ExpectAllExtensionsSet(message2); | 214 TestUtil::ExpectAllExtensionsSet(message2); |
| 283 message2.CopyFrom(message1); // exercise copy when fields already exist | 215 message2.CopyFrom(message1); // exercise copy when fields already exist |
| 284 TestUtil::ExpectAllExtensionsSet(message2); | 216 TestUtil::ExpectAllExtensionsSet(message2); |
| 285 } | 217 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 TestUtil::ExpectAllExtensionsSet(message); | 256 TestUtil::ExpectAllExtensionsSet(message); |
| 325 message.Swap(&message); | 257 message.Swap(&message); |
| 326 TestUtil::ExpectAllExtensionsSet(message); | 258 TestUtil::ExpectAllExtensionsSet(message); |
| 327 } | 259 } |
| 328 | 260 |
| 329 TEST(ExtensionSetTest, SwapExtension) { | 261 TEST(ExtensionSetTest, SwapExtension) { |
| 330 unittest::TestAllExtensions message1; | 262 unittest::TestAllExtensions message1; |
| 331 unittest::TestAllExtensions message2; | 263 unittest::TestAllExtensions message2; |
| 332 | 264 |
| 333 TestUtil::SetAllExtensions(&message1); | 265 TestUtil::SetAllExtensions(&message1); |
| 334 std::vector<const FieldDescriptor*> fields; | 266 vector<const FieldDescriptor*> fields; |
| 335 | 267 |
| 336 // Swap empty fields. | 268 // Swap empty fields. |
| 337 const Reflection* reflection = message1.GetReflection(); | 269 const Reflection* reflection = message1.GetReflection(); |
| 338 reflection->SwapFields(&message1, &message2, fields); | 270 reflection->SwapFields(&message1, &message2, fields); |
| 339 TestUtil::ExpectAllExtensionsSet(message1); | 271 TestUtil::ExpectAllExtensionsSet(message1); |
| 340 TestUtil::ExpectExtensionsClear(message2); | 272 TestUtil::ExpectExtensionsClear(message2); |
| 341 | 273 |
| 342 // Swap two extensions. | 274 // Swap two extensions. |
| 343 fields.push_back( | 275 fields.push_back( |
| 344 reflection->FindKnownExtensionByNumber(12)); | 276 reflection->FindKnownExtensionByNumber(12)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 356 } | 288 } |
| 357 | 289 |
| 358 TEST(ExtensionSetTest, SwapExtensionWithEmpty) { | 290 TEST(ExtensionSetTest, SwapExtensionWithEmpty) { |
| 359 unittest::TestAllExtensions message1; | 291 unittest::TestAllExtensions message1; |
| 360 unittest::TestAllExtensions message2; | 292 unittest::TestAllExtensions message2; |
| 361 unittest::TestAllExtensions message3; | 293 unittest::TestAllExtensions message3; |
| 362 | 294 |
| 363 TestUtil::SetAllExtensions(&message3); | 295 TestUtil::SetAllExtensions(&message3); |
| 364 | 296 |
| 365 const Reflection* reflection = message3.GetReflection(); | 297 const Reflection* reflection = message3.GetReflection(); |
| 366 std::vector<const FieldDescriptor*> fields; | 298 vector<const FieldDescriptor*> fields; |
| 367 reflection->ListFields(message3, &fields); | 299 reflection->ListFields(message3, &fields); |
| 368 | 300 |
| 369 reflection->SwapFields(&message1, &message2, fields); | 301 reflection->SwapFields(&message1, &message2, fields); |
| 370 | 302 |
| 371 TestUtil::ExpectExtensionsClear(message1); | 303 TestUtil::ExpectExtensionsClear(message1); |
| 372 TestUtil::ExpectExtensionsClear(message2); | 304 TestUtil::ExpectExtensionsClear(message2); |
| 373 } | 305 } |
| 374 | 306 |
| 375 TEST(ExtensionSetTest, SwapExtensionBothFull) { | 307 TEST(ExtensionSetTest, SwapExtensionBothFull) { |
| 376 unittest::TestAllExtensions message1; | 308 unittest::TestAllExtensions message1; |
| 377 unittest::TestAllExtensions message2; | 309 unittest::TestAllExtensions message2; |
| 378 | 310 |
| 379 TestUtil::SetAllExtensions(&message1); | 311 TestUtil::SetAllExtensions(&message1); |
| 380 TestUtil::SetAllExtensions(&message2); | 312 TestUtil::SetAllExtensions(&message2); |
| 381 | 313 |
| 382 const Reflection* reflection = message1.GetReflection(); | 314 const Reflection* reflection = message1.GetReflection(); |
| 383 std::vector<const FieldDescriptor*> fields; | 315 vector<const FieldDescriptor*> fields; |
| 384 reflection->ListFields(message1, &fields); | 316 reflection->ListFields(message1, &fields); |
| 385 | 317 |
| 386 reflection->SwapFields(&message1, &message2, fields); | 318 reflection->SwapFields(&message1, &message2, fields); |
| 387 | 319 |
| 388 TestUtil::ExpectAllExtensionsSet(message1); | 320 TestUtil::ExpectAllExtensionsSet(message1); |
| 389 TestUtil::ExpectAllExtensionsSet(message2); | 321 TestUtil::ExpectAllExtensionsSet(message2); |
| 390 } | 322 } |
| 391 | 323 |
| 392 TEST(ExtensionSetTest, ArenaSetAllExtension) { | 324 TEST(ExtensionSetTest, ArenaSetAllExtension) { |
| 393 ::google::protobuf::Arena arena1; | 325 ::google::protobuf::Arena arena1; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 | 415 |
| 484 unittest::TestAllExtensions* message1 = | 416 unittest::TestAllExtensions* message1 = |
| 485 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); | 417 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1); |
| 486 unittest::TestAllExtensions* message2 = | 418 unittest::TestAllExtensions* message2 = |
| 487 Arena::CreateMessage<unittest::TestAllExtensions>(arena2); | 419 Arena::CreateMessage<unittest::TestAllExtensions>(arena2); |
| 488 | 420 |
| 489 TestUtil::SetAllExtensions(message1); | 421 TestUtil::SetAllExtensions(message1); |
| 490 TestUtil::SetAllExtensions(message2); | 422 TestUtil::SetAllExtensions(message2); |
| 491 | 423 |
| 492 const Reflection* reflection = message1->GetReflection(); | 424 const Reflection* reflection = message1->GetReflection(); |
| 493 std::vector<const FieldDescriptor*> fields; | 425 vector<const FieldDescriptor*> fields; |
| 494 reflection->ListFields(*message1, &fields); | 426 reflection->ListFields(*message1, &fields); |
| 495 reflection->SwapFields(message1, message2, fields); | 427 reflection->SwapFields(message1, message2, fields); |
| 496 TestUtil::ExpectAllExtensionsSet(*message1); | 428 TestUtil::ExpectAllExtensionsSet(*message1); |
| 497 TestUtil::ExpectAllExtensionsSet(*message2); | 429 TestUtil::ExpectAllExtensionsSet(*message2); |
| 498 delete arena2; | 430 delete arena2; |
| 499 TestUtil::ExpectAllExtensionsSet(*message1); | 431 TestUtil::ExpectAllExtensionsSet(*message1); |
| 500 } | 432 } |
| 501 | 433 |
| 502 TEST(ExtensionSetTest, SwapExtensionWithSelf) { | 434 TEST(ExtensionSetTest, SwapExtensionWithSelf) { |
| 503 unittest::TestAllExtensions message1; | 435 unittest::TestAllExtensions message1; |
| 504 | 436 |
| 505 TestUtil::SetAllExtensions(&message1); | 437 TestUtil::SetAllExtensions(&message1); |
| 506 | 438 |
| 507 std::vector<const FieldDescriptor*> fields; | 439 vector<const FieldDescriptor*> fields; |
| 508 const Reflection* reflection = message1.GetReflection(); | 440 const Reflection* reflection = message1.GetReflection(); |
| 509 reflection->ListFields(message1, &fields); | 441 reflection->ListFields(message1, &fields); |
| 510 reflection->SwapFields(&message1, &message1, fields); | 442 reflection->SwapFields(&message1, &message1, fields); |
| 511 | 443 |
| 512 TestUtil::ExpectAllExtensionsSet(message1); | 444 TestUtil::ExpectAllExtensionsSet(message1); |
| 513 } | 445 } |
| 514 | 446 |
| 515 TEST(ExtensionSetTest, SerializationToArray) { | 447 TEST(ExtensionSetTest, SerializationToArray) { |
| 516 // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire | 448 // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire |
| 517 // compatibility of extensions. | 449 // compatibility of extensions. |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 789 EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \ | 721 EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \ |
| 790 message.AddExtension(unittest::repeated_##type##_extension, value); \ | 722 message.AddExtension(unittest::repeated_##type##_extension, value); \ |
| 791 message.AddExtension(unittest::repeated_##type##_extension, value); \ | 723 message.AddExtension(unittest::repeated_##type##_extension, value); \ |
| 792 EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type; \ | 724 EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type; \ |
| 793 message.ClearExtension(unittest::repeated_##type##_extension); \ | 725 message.ClearExtension(unittest::repeated_##type##_extension); \ |
| 794 for (int i = 0; i < 16; ++i) { \ | 726 for (int i = 0; i < 16; ++i) { \ |
| 795 message.AddExtension(unittest::repeated_##type##_extension, value); \ | 727 message.AddExtension(unittest::repeated_##type##_extension, value); \ |
| 796 } \ | 728 } \ |
| 797 int expected_size = sizeof(cpptype) * (16 - \ | 729 int expected_size = sizeof(cpptype) * (16 - \ |
| 798 kMinRepeatedFieldAllocationSize) + empty_repeated_field_size; \ | 730 kMinRepeatedFieldAllocationSize) + empty_repeated_field_size; \ |
| 799 EXPECT_LE(expected_size, message.SpaceUsed()) << #type; \ | 731 EXPECT_EQ(expected_size, message.SpaceUsed()) << #type; \ |
| 800 } while (0) | 732 } while (0) |
| 801 | 733 |
| 802 TEST_REPEATED_EXTENSIONS_SPACE_USED(int32 , int32 , 101); | 734 TEST_REPEATED_EXTENSIONS_SPACE_USED(int32 , int32 , 101); |
| 803 TEST_REPEATED_EXTENSIONS_SPACE_USED(int64 , int64 , 102); | 735 TEST_REPEATED_EXTENSIONS_SPACE_USED(int64 , int64 , 102); |
| 804 TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32 , uint32, 103); | 736 TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32 , uint32, 103); |
| 805 TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64 , uint64, 104); | 737 TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64 , uint64, 104); |
| 806 TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32 , int32 , 105); | 738 TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32 , int32 , 105); |
| 807 TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64 , int64 , 106); | 739 TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64 , int64 , 106); |
| 808 TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32 , uint32, 107); | 740 TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32 , uint32, 107); |
| 809 TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64 , uint64, 108); | 741 TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64 , uint64, 108); |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1266 const Message* prototype = | 1198 const Message* prototype = |
| 1267 dynamic_factory.GetPrototype(dynamic_message_extension->message_type()); | 1199 dynamic_factory.GetPrototype(dynamic_message_extension->message_type()); |
| 1268 EXPECT_EQ(prototype, &sub_message); | 1200 EXPECT_EQ(prototype, &sub_message); |
| 1269 } | 1201 } |
| 1270 } | 1202 } |
| 1271 | 1203 |
| 1272 } // namespace | 1204 } // namespace |
| 1273 } // namespace internal | 1205 } // namespace internal |
| 1274 } // namespace protobuf | 1206 } // namespace protobuf |
| 1275 } // namespace google | 1207 } // namespace google |
| OLD | NEW |