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 |