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{};