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 |