35 #include <google/protobuf/stubs/casts.h>
36 #include <google/protobuf/stubs/strutil.h>
37 #include <google/protobuf/stubs/logging.h>
38 #include <google/protobuf/stubs/common.h>
39 #include <google/protobuf/test_util.h>
40 #include <google/protobuf/test_util2.h>
41 #include <google/protobuf/unittest.pb.h>
42 #include <google/protobuf/unittest_mset.pb.h>
43 #include <google/protobuf/io/coded_stream.h>
44 #include <google/protobuf/io/zero_copy_stream_impl.h>
45 #include <google/protobuf/descriptor.pb.h>
46 #include <google/protobuf/arena.h>
47 #include <google/protobuf/descriptor.h>
48 #include <google/protobuf/dynamic_message.h>
49 #include <google/protobuf/extension_set.h>
50 #include <google/protobuf/wire_format.h>
51 #include <google/protobuf/testing/googletest.h>
52 #include <gtest/gtest.h>
53 #include <google/protobuf/stubs/stl_util.h>
56 #include <google/protobuf/port_def.inc>
69 TEST(ExtensionSetTest, Defaults) {
71 unittest::TestAllExtensions
message;
73 TestUtil::ExpectExtensionsClear(
message);
78 EXPECT_EQ(&unittest::OptionalGroup_extension::default_instance(),
79 &
message.GetExtension(unittest::optionalgroup_extension));
80 EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),
81 &
message.GetExtension(unittest::optional_nested_message_extension));
83 &unittest::ForeignMessage::default_instance(),
84 &
message.GetExtension(unittest::optional_foreign_message_extension));
85 EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),
86 &
message.GetExtension(unittest::optional_import_message_extension));
89 TEST(ExtensionSetTest, Accessors) {
92 unittest::TestAllExtensions
message;
95 TestUtil::ExpectAllExtensionsSet(
message);
97 TestUtil::ModifyRepeatedExtensions(&
message);
98 TestUtil::ExpectRepeatedExtensionsModified(
message);
104 unittest::TestAllExtensions
message;
108 TestUtil::ExpectExtensionsClear(
message);
114 EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(),
115 &
message.GetExtension(unittest::optionalgroup_extension));
116 EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
117 &
message.GetExtension(unittest::optional_nested_message_extension));
119 &unittest::ForeignMessage::default_instance(),
120 &
message.GetExtension(unittest::optional_foreign_message_extension));
121 EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
122 &
message.GetExtension(unittest::optional_import_message_extension));
127 TestUtil::ExpectAllExtensionsSet(
message);
130 TEST(ExtensionSetTest, ClearOneField) {
133 unittest::TestAllExtensions
message;
136 int64 original_value =
137 message.GetExtension(unittest::optional_int64_extension);
140 message.ClearExtension(unittest::optional_int64_extension);
149 message.SetExtension(unittest::optional_int64_extension, original_value);
150 TestUtil::ExpectAllExtensionsSet(
message);
153 TEST(ExtensionSetTest, SetAllocatedExtension) {
154 unittest::TestAllExtensions
message;
156 message.HasExtension(unittest::optional_foreign_message_extension));
158 unittest::ForeignMessage* foreign_message =
new unittest::ForeignMessage();
159 message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
162 message.HasExtension(unittest::optional_foreign_message_extension));
164 unittest::optional_foreign_message_extension));
166 unittest::optional_foreign_message_extension));
170 message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
171 new unittest::ForeignMessage());
174 message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
177 message.HasExtension(unittest::optional_foreign_message_extension));
180 TEST(ExtensionSetTest, ReleaseExtension) {
181 proto2_wireformat_unittest::TestMessageSet
message;
183 unittest::TestMessageSetExtension1::message_set_extension));
185 unittest::TestMessageSetExtension1*
extension =
186 new unittest::TestMessageSetExtension1();
188 unittest::TestMessageSetExtension1::message_set_extension,
extension);
190 unittest::TestMessageSetExtension1::message_set_extension));
192 unittest::TestMessageSetExtension1* released_extension =
194 unittest::TestMessageSetExtension1::message_set_extension);
197 unittest::TestMessageSetExtension1::message_set_extension));
201 unittest::TestMessageSetExtension1::message_set_extension,
204 unittest::TestMessageSetExtension1::message_set_extension);
205 released_extension =
message.ReleaseExtension(
206 unittest::TestMessageSetExtension1::message_set_extension);
208 delete released_extension;
211 TEST(ExtensionSetTest, ArenaUnsafeArenaSetAllocatedAndRelease) {
213 unittest::TestAllExtensions*
message =
214 Arena::CreateMessage<unittest::TestAllExtensions>(&
arena);
216 message->UnsafeArenaSetAllocatedExtension(
217 unittest::optional_foreign_message_extension, &
extension);
219 unittest::ForeignMessage* mutable_extension =
220 message->MutableExtension(unittest::optional_foreign_message_extension);
223 unittest::ForeignMessage* released_extension =
224 message->UnsafeArenaReleaseExtension(
225 unittest::optional_foreign_message_extension);
228 message->HasExtension(unittest::optional_foreign_message_extension));
231 message->UnsafeArenaSetAllocatedExtension(
232 unittest::optional_foreign_message_extension, &
extension);
235 TEST(ExtensionSetTest, UnsafeArenaSetAllocatedAndRelease) {
236 unittest::TestAllExtensions
message;
237 unittest::ForeignMessage*
extension =
new unittest::ForeignMessage();
238 message.UnsafeArenaSetAllocatedExtension(
239 unittest::optional_foreign_message_extension,
extension);
241 unittest::ForeignMessage* mutable_extension =
242 message.MutableExtension(unittest::optional_foreign_message_extension);
245 unittest::ForeignMessage* released_extension =
246 message.UnsafeArenaReleaseExtension(
247 unittest::optional_foreign_message_extension);
250 message.HasExtension(unittest::optional_foreign_message_extension));
253 message.UnsafeArenaSetAllocatedExtension(
254 unittest::optional_foreign_message_extension,
extension);
257 TEST(ExtensionSetTest, ArenaUnsafeArenaReleaseOfHeapAlloc) {
259 unittest::TestAllExtensions*
message =
260 Arena::CreateMessage<unittest::TestAllExtensions>(&
arena);
261 unittest::ForeignMessage*
extension =
new unittest::ForeignMessage;
262 message->SetAllocatedExtension(unittest::optional_foreign_message_extension,
266 unittest::ForeignMessage* released_extension =
267 message->UnsafeArenaReleaseExtension(
268 unittest::optional_foreign_message_extension);
271 message->HasExtension(unittest::optional_foreign_message_extension));
276 unittest::TestAllExtensions message1, message2;
279 message2.CopyFrom(message1);
280 TestUtil::ExpectAllExtensionsSet(message2);
281 message2.CopyFrom(message1);
282 TestUtil::ExpectAllExtensionsSet(message2);
285 TEST(ExtensionSetTest, CopyFromPacked) {
286 unittest::TestPackedExtensions message1, message2;
288 TestUtil::SetPackedExtensions(&message1);
289 message2.CopyFrom(message1);
290 TestUtil::ExpectPackedExtensionsSet(message2);
291 message2.CopyFrom(message1);
292 TestUtil::ExpectPackedExtensionsSet(message2);
295 TEST(ExtensionSetTest, CopyFromUpcasted) {
296 unittest::TestAllExtensions message1, message2;
297 const Message& upcasted_message = message1;
300 message2.CopyFrom(upcasted_message);
301 TestUtil::ExpectAllExtensionsSet(message2);
303 message2.CopyFrom(upcasted_message);
304 TestUtil::ExpectAllExtensionsSet(message2);
307 TEST(ExtensionSetTest, SwapWithEmpty) {
308 unittest::TestAllExtensions message1, message2;
311 TestUtil::ExpectAllExtensionsSet(message1);
312 TestUtil::ExpectExtensionsClear(message2);
313 message1.Swap(&message2);
314 TestUtil::ExpectAllExtensionsSet(message2);
315 TestUtil::ExpectExtensionsClear(message1);
318 TEST(ExtensionSetTest, SwapWithSelf) {
319 unittest::TestAllExtensions
message;
322 TestUtil::ExpectAllExtensionsSet(
message);
324 TestUtil::ExpectAllExtensionsSet(
message);
327 TEST(ExtensionSetTest, SwapExtension) {
328 unittest::TestAllExtensions message1;
329 unittest::TestAllExtensions message2;
332 std::vector<const FieldDescriptor*>
fields;
335 const Reflection* reflection = message1.GetReflection();
336 reflection->SwapFields(&message1, &message2,
fields);
337 TestUtil::ExpectAllExtensionsSet(message1);
338 TestUtil::ExpectExtensionsClear(message2);
341 fields.push_back(reflection->FindKnownExtensionByNumber(12));
342 fields.push_back(reflection->FindKnownExtensionByNumber(25));
343 reflection->SwapFields(&message1, &message2,
fields);
345 EXPECT_TRUE(message1.HasExtension(unittest::optional_int32_extension));
346 EXPECT_FALSE(message1.HasExtension(unittest::optional_double_extension));
347 EXPECT_FALSE(message1.HasExtension(unittest::optional_cord_extension));
349 EXPECT_FALSE(message2.HasExtension(unittest::optional_int32_extension));
350 EXPECT_TRUE(message2.HasExtension(unittest::optional_double_extension));
351 EXPECT_TRUE(message2.HasExtension(unittest::optional_cord_extension));
354 TEST(ExtensionSetTest, SwapExtensionWithEmpty) {
355 unittest::TestAllExtensions message1;
356 unittest::TestAllExtensions message2;
357 unittest::TestAllExtensions message3;
361 const Reflection* reflection = message3.GetReflection();
362 std::vector<const FieldDescriptor*>
fields;
363 reflection->ListFields(message3, &
fields);
365 reflection->SwapFields(&message1, &message2,
fields);
367 TestUtil::ExpectExtensionsClear(message1);
368 TestUtil::ExpectExtensionsClear(message2);
371 TEST(ExtensionSetTest, SwapExtensionBothFull) {
372 unittest::TestAllExtensions message1;
373 unittest::TestAllExtensions message2;
378 const Reflection* reflection = message1.GetReflection();
379 std::vector<const FieldDescriptor*>
fields;
380 reflection->ListFields(message1, &
fields);
382 reflection->SwapFields(&message1, &message2,
fields);
384 TestUtil::ExpectAllExtensionsSet(message1);
385 TestUtil::ExpectAllExtensionsSet(message2);
388 TEST(ExtensionSetTest, ArenaSetAllExtension) {
390 unittest::TestAllExtensions* message1 =
391 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
393 TestUtil::ExpectAllExtensionsSet(*message1);
396 TEST(ExtensionSetTest, ArenaCopyConstructor) {
398 unittest::TestAllExtensions* message1 =
399 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
401 unittest::TestAllExtensions message2(*message1);
403 TestUtil::ExpectAllExtensionsSet(message2);
406 TEST(ExtensionSetTest, ArenaMergeFrom) {
408 unittest::TestAllExtensions* message1 =
409 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
411 unittest::TestAllExtensions message2;
412 message2.MergeFrom(*message1);
414 TestUtil::ExpectAllExtensionsSet(message2);
417 TEST(ExtensionSetTest, ArenaSetAllocatedMessageAndRelease) {
419 unittest::TestAllExtensions*
message =
420 Arena::CreateMessage<unittest::TestAllExtensions>(&
arena);
422 message->HasExtension(unittest::optional_foreign_message_extension));
424 unittest::ForeignMessage* foreign_message =
new unittest::ForeignMessage();
425 message->SetAllocatedExtension(unittest::optional_foreign_message_extension,
429 unittest::optional_foreign_message_extension));
432 unittest::ForeignMessage* released_message =
433 message->ReleaseExtension(unittest::optional_foreign_message_extension);
434 delete released_message;
436 message->HasExtension(unittest::optional_foreign_message_extension));
439 TEST(ExtensionSetTest, SwapExtensionBothFullWithArena) {
441 std::unique_ptr<Arena> arena2(
new Arena());
443 unittest::TestAllExtensions* message1 =
444 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
445 unittest::TestAllExtensions* message2 =
446 Arena::CreateMessage<unittest::TestAllExtensions>(arena2.get());
450 message1->SetExtension(unittest::optional_int32_extension, 1);
451 message2->SetExtension(unittest::optional_int32_extension, 2);
452 message1->Swap(message2);
453 EXPECT_EQ(2, message1->GetExtension(unittest::optional_int32_extension));
454 EXPECT_EQ(1, message2->GetExtension(unittest::optional_int32_extension));
456 message1->SetExtension(unittest::optional_int32_extension, 101);
457 message2->SetExtension(unittest::optional_int32_extension, 101);
458 TestUtil::ExpectAllExtensionsSet(*message1);
459 TestUtil::ExpectAllExtensionsSet(*message2);
460 arena2.reset(
nullptr);
461 TestUtil::ExpectAllExtensionsSet(*message1);
463 Arena arena3, arena4;
465 unittest::TestAllExtensions* message3 =
466 Arena::CreateMessage<unittest::TestAllExtensions>(&arena3);
467 unittest::TestAllExtensions* message4 =
468 Arena::CreateMessage<unittest::TestAllExtensions>(&arena4);
470 message3->Swap(message4);
472 TestUtil::ExpectAllExtensionsSet(*message4);
475 TEST(ExtensionSetTest, SwapFieldsOfExtensionBothFullWithArena) {
479 unittest::TestAllExtensions* message1 =
480 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
481 unittest::TestAllExtensions* message2 =
482 Arena::CreateMessage<unittest::TestAllExtensions>(arena2);
487 const Reflection* reflection = message1->GetReflection();
488 std::vector<const FieldDescriptor*>
fields;
489 reflection->ListFields(*message1, &
fields);
490 reflection->SwapFields(message1, message2,
fields);
491 TestUtil::ExpectAllExtensionsSet(*message1);
492 TestUtil::ExpectAllExtensionsSet(*message2);
494 TestUtil::ExpectAllExtensionsSet(*message1);
497 TEST(ExtensionSetTest, SwapExtensionWithSelf) {
498 unittest::TestAllExtensions message1;
502 std::vector<const FieldDescriptor*>
fields;
503 const Reflection* reflection = message1.GetReflection();
504 reflection->ListFields(message1, &
fields);
505 reflection->SwapFields(&message1, &message1,
fields);
507 TestUtil::ExpectAllExtensionsSet(message1);
510 TEST(ExtensionSetTest, SerializationToArray) {
517 unittest::TestAllExtensions source;
518 unittest::TestAllTypes destination;
520 size_t size = source.ByteSizeLong();
530 TEST(ExtensionSetTest, SerializationToStream) {
538 unittest::TestAllExtensions source;
539 unittest::TestAllTypes destination;
541 size_t size = source.ByteSizeLong();
547 source.SerializeWithCachedSizes(&output_stream);
554 TEST(ExtensionSetTest, PackedSerializationToArray) {
561 unittest::TestPackedExtensions source;
562 unittest::TestPackedTypes destination;
563 TestUtil::SetPackedExtensions(&source);
564 size_t size = source.ByteSizeLong();
571 TestUtil::ExpectPackedFieldsSet(destination);
574 TEST(ExtensionSetTest, PackedSerializationToStream) {
582 unittest::TestPackedExtensions source;
583 unittest::TestPackedTypes destination;
584 TestUtil::SetPackedExtensions(&source);
585 size_t size = source.ByteSizeLong();
591 source.SerializeWithCachedSizes(&output_stream);
595 TestUtil::ExpectPackedFieldsSet(destination);
598 TEST(ExtensionSetTest, NestedExtensionGroup) {
600 unittest::TestGroup source;
601 unittest::TestGroupExtension destination;
604 source.mutable_optionalgroup()->set_a(117);
605 source.set_optional_foreign_enum(unittest::FOREIGN_BAZ);
606 source.SerializeToString(&
data);
610 .GetExtension(unittest::TestNestedExtension::optionalgroup_extension)
614 unittest::TestNestedExtension::optionalgroup_extension)
617 unittest::TestNestedExtension::optional_foreign_enum_extension));
619 unittest::FOREIGN_BAZ,
620 destination.GetExtension(
621 unittest::TestNestedExtension::optional_foreign_enum_extension));
624 TEST(ExtensionSetTest, Parsing) {
626 unittest::TestAllTypes source;
627 unittest::TestAllExtensions destination;
631 source.SerializeToString(&
data);
633 TestUtil::SetOneofFields(&destination);
634 TestUtil::ExpectAllExtensionsSet(destination);
637 TEST(ExtensionSetTest, PackedParsing) {
639 unittest::TestPackedTypes source;
640 unittest::TestPackedExtensions destination;
643 TestUtil::SetPackedFields(&source);
644 source.SerializeToString(&
data);
646 TestUtil::ExpectPackedExtensionsSet(destination);
649 TEST(ExtensionSetTest, PackedToUnpackedParsing) {
650 unittest::TestPackedTypes source;
651 unittest::TestUnpackedExtensions destination;
654 TestUtil::SetPackedFields(&source);
655 source.SerializeToString(&
data);
657 TestUtil::ExpectUnpackedExtensionsSet(destination);
660 unittest::TestUnpackedTypes unpacked;
661 TestUtil::SetUnpackedFields(&unpacked);
663 EXPECT_EQ(unpacked.SerializeAsString().size(),
664 destination.SerializeAsString().size());
668 destination.AddExtension(unittest::unpacked_int32_extension, 1);
669 destination.AddExtension(unittest::unpacked_enum_extension,
670 protobuf_unittest::FOREIGN_BAR);
673 TEST(ExtensionSetTest, UnpackedToPackedParsing) {
674 unittest::TestUnpackedTypes source;
675 unittest::TestPackedExtensions destination;
678 TestUtil::SetUnpackedFields(&source);
679 source.SerializeToString(&
data);
681 TestUtil::ExpectPackedExtensionsSet(destination);
684 unittest::TestPackedTypes packed;
685 TestUtil::SetPackedFields(&packed);
687 EXPECT_EQ(packed.SerializeAsString().size(),
688 destination.SerializeAsString().size());
692 destination.AddExtension(unittest::packed_int32_extension, 1);
693 destination.AddExtension(unittest::packed_enum_extension,
694 protobuf_unittest::FOREIGN_BAR);
700 unittest::TestAllExtensions
message;
704 message.MutableExtension(unittest::TestRequired::single);
707 message.MutableExtension(unittest::TestRequired::single)->set_a(1);
709 message.MutableExtension(unittest::TestRequired::single)->set_b(2);
711 message.MutableExtension(unittest::TestRequired::single)->set_c(3);
714 message.AddExtension(unittest::TestRequired::multi);
717 message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1);
719 message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2);
721 message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3);
725 TEST(ExtensionSetTest, MutableString) {
727 unittest::TestAllExtensions
message;
729 message.MutableExtension(unittest::optional_string_extension)->assign(
"foo");
731 EXPECT_EQ(
"foo",
message.GetExtension(unittest::optional_string_extension));
733 message.AddExtension(unittest::repeated_string_extension)->assign(
"bar");
736 message.GetExtension(unittest::repeated_string_extension, 0));
739 TEST(ExtensionSetTest, SpaceUsedExcludingSelf) {
742 #define TEST_SCALAR_EXTENSIONS_SPACE_USED(type, value) \
744 unittest::TestAllExtensions message; \
745 const int base_size = message.SpaceUsedLong(); \
746 message.SetExtension(unittest::optional_##type##_extension, value); \
747 int min_expected_size = \
749 sizeof(message.GetExtension(unittest::optional_##type##_extension)); \
750 EXPECT_LE(min_expected_size, message.SpaceUsedLong()); \
766 #undef TEST_SCALAR_EXTENSIONS_SPACE_USED
768 unittest::TestAllExtensions
message;
769 const int base_size =
message.SpaceUsedLong();
770 message.SetExtension(unittest::optional_nested_enum_extension,
771 unittest::TestAllTypes::FOO);
772 int min_expected_size =
774 sizeof(
message.GetExtension(unittest::optional_nested_enum_extension));
780 unittest::TestAllExtensions
message;
781 const int base_size =
message.SpaceUsedLong();
783 "this is a fairly large string that will cause some "
784 "allocation in order to store it in the extension");
785 message.SetExtension(unittest::optional_string_extension, s);
786 int min_expected_size = base_size +
s.length();
791 unittest::TestAllExtensions
message;
792 const int base_size =
message.SpaceUsedLong();
793 unittest::ForeignMessage foreign;
795 message.MutableExtension(unittest::optional_foreign_message_extension)
797 int min_expected_size = base_size + foreign.SpaceUsedLong();
811 #define TEST_REPEATED_EXTENSIONS_SPACE_USED(type, cpptype, value) \
813 unittest::TestAllExtensions message; \
814 const size_t base_size = message.SpaceUsedLong(); \
815 size_t min_expected_size = sizeof(RepeatedField<cpptype>) + base_size; \
816 message.AddExtension(unittest::repeated_##type##_extension, value); \
817 message.ClearExtension(unittest::repeated_##type##_extension); \
818 const size_t empty_repeated_field_size = message.SpaceUsedLong(); \
819 EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \
820 message.AddExtension(unittest::repeated_##type##_extension, value); \
821 message.AddExtension(unittest::repeated_##type##_extension, value); \
822 EXPECT_EQ(empty_repeated_field_size, message.SpaceUsedLong()) << #type; \
823 message.ClearExtension(unittest::repeated_##type##_extension); \
824 const size_t old_capacity = \
825 message.GetRepeatedExtension(unittest::repeated_##type##_extension) \
827 EXPECT_GE(old_capacity, kRepeatedFieldLowerClampLimit); \
828 for (int i = 0; i < 16; ++i) { \
829 message.AddExtension(unittest::repeated_##type##_extension, value); \
831 int expected_size = \
834 .GetRepeatedExtension(unittest::repeated_##type##_extension) \
837 empty_repeated_field_size; \
838 EXPECT_LE(expected_size, message.SpaceUsedLong()) << #type; \
855 unittest::TestAllTypes::FOO);
856 #undef TEST_REPEATED_EXTENSIONS_SPACE_USED
859 unittest::TestAllExtensions
message;
860 const size_t base_size =
message.SpaceUsedLong();
861 size_t min_expected_size =
862 sizeof(RepeatedPtrField<std::string>) + base_size;
867 for (
int i = 0;
i < 16; ++
i) {
868 message.AddExtension(unittest::repeated_string_extension,
value);
876 unittest::TestAllExtensions
message;
877 const size_t base_size =
message.SpaceUsedLong();
878 size_t min_expected_size =
879 sizeof(RepeatedPtrField<unittest::ForeignMessage>) + base_size;
880 unittest::ForeignMessage prototype;
882 for (
int i = 0;
i < 16; ++
i) {
883 message.AddExtension(unittest::repeated_foreign_message_extension)
884 ->CopyFrom(prototype);
893 template <
typename T,
typename M,
typename ID>
906 template <
typename T,
typename M,
typename ID>
917 TEST(ExtensionSetTest, RepeatedFields) {
918 unittest::TestAllExtensions
message;
923 message.GetRepeatedExtension(unittest::repeated_int32_extension).size());
925 0,
message.GetRepeatedExtension(unittest::repeated_nested_enum_extension)
929 message.GetRepeatedExtension(unittest::repeated_string_extension).size());
932 message.GetRepeatedExtension(unittest::repeated_nested_message_extension)
935 unittest::TestAllTypes::NestedMessage nested_message;
936 nested_message.set_bb(42);
937 unittest::TestAllTypes::NestedEnum nested_enum =
938 unittest::TestAllTypes::NestedEnum_MIN;
940 for (
int i = 0;
i < 10; ++
i) {
941 message.AddExtension(unittest::repeated_int32_extension, 1);
942 message.AddExtension(unittest::repeated_int64_extension, 2);
943 message.AddExtension(unittest::repeated_uint32_extension, 3);
944 message.AddExtension(unittest::repeated_uint64_extension, 4);
945 message.AddExtension(unittest::repeated_sint32_extension, 5);
946 message.AddExtension(unittest::repeated_sint64_extension, 6);
947 message.AddExtension(unittest::repeated_fixed32_extension, 7);
948 message.AddExtension(unittest::repeated_fixed64_extension, 8);
949 message.AddExtension(unittest::repeated_sfixed32_extension, 7);
950 message.AddExtension(unittest::repeated_sfixed64_extension, 8);
951 message.AddExtension(unittest::repeated_float_extension, 9.0);
952 message.AddExtension(unittest::repeated_double_extension, 10.0);
953 message.AddExtension(unittest::repeated_bool_extension,
true);
954 message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum);
955 message.AddExtension(unittest::repeated_string_extension,
957 message.AddExtension(unittest::repeated_bytes_extension,
959 message.AddExtension(unittest::repeated_nested_message_extension)
960 ->CopyFrom(nested_message);
961 message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum);
965 unittest::repeated_int32_extension, 0));
966 IncAllExtensions<int32>(&
message, unittest::repeated_int32_extension, 1);
968 unittest::repeated_int32_extension, 0));
971 unittest::repeated_int64_extension, 0));
972 IncAllExtensions<int64>(&
message, unittest::repeated_int64_extension, 1);
974 unittest::repeated_int64_extension, 0));
977 message, unittest::repeated_uint32_extension, 0));
978 IncAllExtensions<uint32>(&
message, unittest::repeated_uint32_extension, 1);
980 message, unittest::repeated_uint32_extension, 0));
983 message, unittest::repeated_uint64_extension, 0));
984 IncAllExtensions<uint64>(&
message, unittest::repeated_uint64_extension, 1);
986 message, unittest::repeated_uint64_extension, 0));
989 message, unittest::repeated_sint32_extension, 0));
990 IncAllExtensions<int32>(&
message, unittest::repeated_sint32_extension, 1);
992 message, unittest::repeated_sint32_extension, 0));
995 message, unittest::repeated_sint64_extension, 0));
996 IncAllExtensions<int64>(&
message, unittest::repeated_sint64_extension, 1);
998 message, unittest::repeated_sint64_extension, 0));
1001 message, unittest::repeated_fixed32_extension, 0));
1002 IncAllExtensions<uint32>(&
message, unittest::repeated_fixed32_extension, 1);
1004 message, unittest::repeated_fixed32_extension, 0));
1007 message, unittest::repeated_fixed64_extension, 0));
1008 IncAllExtensions<uint64>(&
message, unittest::repeated_fixed64_extension, 1);
1010 message, unittest::repeated_fixed64_extension, 0));
1017 unittest::repeated_float_extension, 0));
1018 IncAllExtensions<float>(&
message, unittest::repeated_float_extension, 1);
1020 message, unittest::repeated_float_extension, 0));
1022 ASSERT_EQ(100, SumAllExtensions<double>(
1023 message, unittest::repeated_double_extension, 0));
1024 IncAllExtensions<double>(&
message, unittest::repeated_double_extension, 1);
1025 ASSERT_EQ(110, SumAllExtensions<double>(
1026 message, unittest::repeated_double_extension, 0));
1032 .MutableRepeatedExtension(unittest::repeated_string_extension)
1036 .MutableRepeatedExtension(unittest::repeated_string_extension)
1038 string_iter != string_end; ++string_iter) {
1039 *string_iter +=
"test";
1043 for (string_const_iter =
1044 message.GetRepeatedExtension(unittest::repeated_string_extension)
1047 message.GetRepeatedExtension(unittest::repeated_string_extension)
1049 string_iter != string_end; ++string_iter) {
1056 .MutableRepeatedExtension(
1057 unittest::repeated_nested_enum_extension)
1060 .MutableRepeatedExtension(
1061 unittest::repeated_nested_enum_extension)
1063 enum_iter != enum_end; ++enum_iter) {
1064 *enum_iter = unittest::TestAllTypes::NestedEnum_MAX;
1070 for (enum_const_iter =
1072 .GetRepeatedExtension(unittest::repeated_nested_enum_extension)
1076 .GetRepeatedExtension(unittest::repeated_nested_enum_extension)
1078 enum_const_iter != enum_const_end; ++enum_const_iter) {
1079 ASSERT_EQ(*enum_const_iter, unittest::TestAllTypes::NestedEnum_MAX);
1085 .MutableRepeatedExtension(
1086 unittest::repeated_nested_message_extension)
1089 .MutableRepeatedExtension(
1090 unittest::repeated_nested_message_extension)
1092 msg_iter != msg_end; ++msg_iter) {
1093 msg_iter->set_bb(1234);
1100 .GetRepeatedExtension(
1101 unittest::repeated_nested_message_extension)
1104 .GetRepeatedExtension(
1105 unittest::repeated_nested_message_extension)
1107 msg_const_iter != msg_const_end; ++msg_const_iter) {
1113 *
message.MutableRepeatedExtension(unittest::repeated_int32_extension)) {
1116 for (
const auto& x :
1117 message.GetRepeatedExtension(unittest::repeated_int32_extension)) {
1122 *
message.MutableRepeatedExtension(unittest::repeated_string_extension)) {
1123 x =
"test_range_based_for";
1125 for (
const auto& x :
1126 message.GetRepeatedExtension(unittest::repeated_string_extension)) {
1130 for (
auto& x : *
message.MutableRepeatedExtension(
1131 unittest::repeated_nested_message_extension)) {
1134 for (
const auto& x : *
message.MutableRepeatedExtension(
1135 unittest::repeated_nested_message_extension)) {
1141 TEST(ExtensionSetTest, AbsentExtension) {
1142 unittest::TestAllExtensions
message;
1143 message.MutableRepeatedExtension(unittest::repeated_nested_message_extension)
1147 message.ExtensionSize(unittest::repeated_nested_message_extension));
1149 message.GetExtension(unittest::repeated_nested_message_extension, 0)
1153 #ifdef PROTOBUF_HAS_DEATH_TEST
1155 TEST(ExtensionSetTest, InvalidEnumDeath) {
1156 unittest::TestAllExtensions
message;
1158 message.SetExtension(unittest::optional_foreign_enum_extension,
1159 static_cast<unittest::ForeignEnum
>(53)),
1163 #endif // PROTOBUF_HAS_DEATH_TEST
1165 TEST(ExtensionSetTest, DynamicExtensions) {
1169 dynamic_proto.
set_name(
"dynamic_extensions_test.proto");
1179 template_descriptor->CopyTo(&template_descriptor_proto);
1185 template_descriptor_proto.
field());
1210 dynamic_factory.SetDelegateToGeneratedFactory(
true);
1216 unittest::TestDynamicExtensions dynamic_extension;
1218 unittest::TestDynamicExtensions
message;
1219 message.set_scalar_extension(123);
1220 message.set_enum_extension(unittest::FOREIGN_BAR);
1221 message.set_dynamic_enum_extension(
1222 unittest::TestDynamicExtensions::DYNAMIC_BAZ);
1223 message.mutable_message_extension()->set_c(456);
1224 message.mutable_dynamic_message_extension()->set_dynamic_field(789);
1225 message.add_repeated_extension(
"foo");
1226 message.add_repeated_extension(
"bar");
1227 message.add_packed_extension(12);
1228 message.add_packed_extension(-34);
1229 message.add_packed_extension(56);
1230 message.add_packed_extension(-78);
1235 message.mutable_unknown_fields()->AddVarint(
1236 unittest::TestDynamicExtensions::kDynamicEnumExtensionFieldNumber,
1239 message.mutable_unknown_fields()->AddLengthDelimited(54321,
"unknown");
1246 unittest::TestAllExtensions
message;
1250 input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory);
1257 "[dynamic_extensions.scalar_extension]: 123\n"
1258 "[dynamic_extensions.enum_extension]: FOREIGN_BAR\n"
1259 "[dynamic_extensions.dynamic_enum_extension]: DYNAMIC_BAZ\n"
1260 "[dynamic_extensions.message_extension] {\n"
1263 "[dynamic_extensions.dynamic_message_extension] {\n"
1264 " dynamic_field: 789\n"
1266 "[dynamic_extensions.repeated_extension]: \"foo\"\n"
1267 "[dynamic_extensions.repeated_extension]: \"bar\"\n"
1268 "[dynamic_extensions.packed_extension]: 12\n"
1269 "[dynamic_extensions.packed_extension]: -34\n"
1270 "[dynamic_extensions.packed_extension]: 56\n"
1271 "[dynamic_extensions.packed_extension]: -78\n"
1273 "54321: \"unknown\"\n",
1282 unittest::TestAllExtensions message2;
1285 input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory);
1294 file->FindExtensionByName(
"message_extension");
1298 const unittest::ForeignMessage* typed_sub_message =
1300 dynamic_cast<const unittest::ForeignMessage*
>(&sub_message);
1302 static_cast<const unittest::ForeignMessage*
>(&sub_message);
1312 file->FindExtensionByName(
"dynamic_message_extension");
1313 ASSERT_TRUE(dynamic_message_extension !=
nullptr);
1314 const Message& parent = unittest::TestAllExtensions::default_instance();
1315 const Message& sub_message = parent.GetReflection()->GetMessage(
1316 parent, dynamic_message_extension, &dynamic_factory);
1318 dynamic_factory.GetPrototype(dynamic_message_extension->message_type());
1323 TEST(ExtensionSetTest, BoolExtension) {
1324 unittest::TestAllExtensions
msg;
1325 uint8 wire_bytes[2] = {13 * 8, 42 };
1327 EXPECT_TRUE(
msg.GetExtension(protobuf_unittest::optional_bool_extension));
1330 TEST(ExtensionSetTest, ConstInit) {
1331 PROTOBUF_CONSTINIT
static ExtensionSet
set{};