Home | History | Annotate | Download | only in protobuf
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 // Author: kenton (at) google.com (Kenton Varda)
     32 //  Based on original Protocol Buffers design by
     33 //  Sanjay Ghemawat, Jeff Dean, and others.
     34 //
     35 // To test GeneratedMessageReflection, we actually let the protocol compiler
     36 // generate a full protocol message implementation and then test its
     37 // reflection interface.  This is much easier and more maintainable than
     38 // trying to create our own Message class for GeneratedMessageReflection
     39 // to wrap.
     40 //
     41 // The tests here closely mirror some of the tests in
     42 // compiler/cpp/unittest, except using the reflection interface
     43 // rather than generated accessors.
     44 
     45 #include <google/protobuf/generated_message_reflection.h>
     46 #include <google/protobuf/descriptor.h>
     47 #include <google/protobuf/test_util.h>
     48 #include <google/protobuf/unittest.pb.h>
     49 
     50 #include <google/protobuf/stubs/common.h>
     51 #include <google/protobuf/testing/googletest.h>
     52 #include <gtest/gtest.h>
     53 
     54 namespace google {
     55 namespace protobuf {
     56 
     57 namespace {
     58 
     59 // Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.
     60 const FieldDescriptor* F(const string& name) {
     61   const FieldDescriptor* result =
     62     unittest::TestAllTypes::descriptor()->FindFieldByName(name);
     63   GOOGLE_CHECK(result != NULL);
     64   return result;
     65 }
     66 
     67 TEST(GeneratedMessageReflectionTest, Defaults) {
     68   // Check that all default values are set correctly in the initial message.
     69   unittest::TestAllTypes message;
     70   TestUtil::ReflectionTester reflection_tester(
     71     unittest::TestAllTypes::descriptor());
     72 
     73   reflection_tester.ExpectClearViaReflection(message);
     74 
     75   const Reflection* reflection = message.GetReflection();
     76 
     77   // Messages should return pointers to default instances until first use.
     78   // (This is not checked by ExpectClear() since it is not actually true after
     79   // the fields have been set and then cleared.)
     80   EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(),
     81             &reflection->GetMessage(message, F("optionalgroup")));
     82   EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),
     83             &reflection->GetMessage(message, F("optional_nested_message")));
     84   EXPECT_EQ(&unittest::ForeignMessage::default_instance(),
     85             &reflection->GetMessage(message, F("optional_foreign_message")));
     86   EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),
     87             &reflection->GetMessage(message, F("optional_import_message")));
     88 }
     89 
     90 TEST(GeneratedMessageReflectionTest, Accessors) {
     91   // Set every field to a unique value then go back and check all those
     92   // values.
     93   unittest::TestAllTypes message;
     94   TestUtil::ReflectionTester reflection_tester(
     95     unittest::TestAllTypes::descriptor());
     96 
     97   reflection_tester.SetAllFieldsViaReflection(&message);
     98   TestUtil::ExpectAllFieldsSet(message);
     99   reflection_tester.ExpectAllFieldsSetViaReflection(message);
    100 
    101   reflection_tester.ModifyRepeatedFieldsViaReflection(&message);
    102   TestUtil::ExpectRepeatedFieldsModified(message);
    103 }
    104 
    105 TEST(GeneratedMessageReflectionTest, GetStringReference) {
    106   // Test that GetStringReference() returns the underlying string when it is
    107   // a normal string field.
    108   unittest::TestAllTypes message;
    109   message.set_optional_string("foo");
    110   message.add_repeated_string("foo");
    111 
    112   const Reflection* reflection = message.GetReflection();
    113   string scratch;
    114 
    115   EXPECT_EQ(&message.optional_string(),
    116       &reflection->GetStringReference(message, F("optional_string"), &scratch))
    117     << "For simple string fields, GetStringReference() should return a "
    118        "reference to the underlying string.";
    119   EXPECT_EQ(&message.repeated_string(0),
    120       &reflection->GetRepeatedStringReference(message, F("repeated_string"),
    121                                               0, &scratch))
    122     << "For simple string fields, GetRepeatedStringReference() should return "
    123        "a reference to the underlying string.";
    124 }
    125 
    126 
    127 TEST(GeneratedMessageReflectionTest, DefaultsAfterClear) {
    128   // Check that after setting all fields and then clearing, getting an
    129   // embedded message does NOT return the default instance.
    130   unittest::TestAllTypes message;
    131   TestUtil::ReflectionTester reflection_tester(
    132     unittest::TestAllTypes::descriptor());
    133 
    134   TestUtil::SetAllFields(&message);
    135   message.Clear();
    136 
    137   const Reflection* reflection = message.GetReflection();
    138 
    139   EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),
    140             &reflection->GetMessage(message, F("optionalgroup")));
    141   EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
    142             &reflection->GetMessage(message, F("optional_nested_message")));
    143   EXPECT_NE(&unittest::ForeignMessage::default_instance(),
    144             &reflection->GetMessage(message, F("optional_foreign_message")));
    145   EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
    146             &reflection->GetMessage(message, F("optional_import_message")));
    147 }
    148 
    149 
    150 TEST(GeneratedMessageReflectionTest, Swap) {
    151   unittest::TestAllTypes message1;
    152   unittest::TestAllTypes message2;
    153 
    154   TestUtil::SetAllFields(&message1);
    155 
    156   const Reflection* reflection = message1.GetReflection();
    157   reflection->Swap(&message1, &message2);
    158 
    159   TestUtil::ExpectClear(message1);
    160   TestUtil::ExpectAllFieldsSet(message2);
    161 }
    162 
    163 TEST(GeneratedMessageReflectionTest, SwapWithBothSet) {
    164   unittest::TestAllTypes message1;
    165   unittest::TestAllTypes message2;
    166 
    167   TestUtil::SetAllFields(&message1);
    168   TestUtil::SetAllFields(&message2);
    169   TestUtil::ModifyRepeatedFields(&message2);
    170 
    171   const Reflection* reflection = message1.GetReflection();
    172   reflection->Swap(&message1, &message2);
    173 
    174   TestUtil::ExpectRepeatedFieldsModified(message1);
    175   TestUtil::ExpectAllFieldsSet(message2);
    176 
    177   message1.set_optional_int32(532819);
    178 
    179   reflection->Swap(&message1, &message2);
    180 
    181   EXPECT_EQ(532819, message2.optional_int32());
    182 }
    183 
    184 TEST(GeneratedMessageReflectionTest, SwapExtensions) {
    185   unittest::TestAllExtensions message1;
    186   unittest::TestAllExtensions message2;
    187 
    188   TestUtil::SetAllExtensions(&message1);
    189 
    190   const Reflection* reflection = message1.GetReflection();
    191   reflection->Swap(&message1, &message2);
    192 
    193   TestUtil::ExpectExtensionsClear(message1);
    194   TestUtil::ExpectAllExtensionsSet(message2);
    195 }
    196 
    197 TEST(GeneratedMessageReflectionTest, SwapUnknown) {
    198   unittest::TestEmptyMessage message1, message2;
    199 
    200   message1.mutable_unknown_fields()->AddVarint(1234, 1);
    201 
    202   EXPECT_EQ(1, message1.unknown_fields().field_count());
    203   EXPECT_EQ(0, message2.unknown_fields().field_count());
    204   const Reflection* reflection = message1.GetReflection();
    205   reflection->Swap(&message1, &message2);
    206   EXPECT_EQ(0, message1.unknown_fields().field_count());
    207   EXPECT_EQ(1, message2.unknown_fields().field_count());
    208 }
    209 
    210 TEST(GeneratedMessageReflectionTest, SwapFields) {
    211   unittest::TestAllTypes message1, message2;
    212   message1.set_optional_double(12.3);
    213   message1.mutable_repeated_int32()->Add(10);
    214   message1.mutable_repeated_int32()->Add(20);
    215 
    216   message2.set_optional_string("hello");
    217   message2.mutable_repeated_int64()->Add(30);
    218 
    219   vector<const FieldDescriptor*> fields;
    220   const Descriptor* descriptor = message1.GetDescriptor();
    221   fields.push_back(descriptor->FindFieldByName("optional_double"));
    222   fields.push_back(descriptor->FindFieldByName("repeated_int32"));
    223   fields.push_back(descriptor->FindFieldByName("optional_string"));
    224   fields.push_back(descriptor->FindFieldByName("optional_uint64"));
    225 
    226   const Reflection* reflection = message1.GetReflection();
    227   reflection->SwapFields(&message1, &message2, fields);
    228 
    229   EXPECT_FALSE(message1.has_optional_double());
    230   EXPECT_EQ(0, message1.repeated_int32_size());
    231   EXPECT_TRUE(message1.has_optional_string());
    232   EXPECT_EQ("hello", message1.optional_string());
    233   EXPECT_EQ(0, message1.repeated_int64_size());
    234   EXPECT_FALSE(message1.has_optional_uint64());
    235 
    236   EXPECT_TRUE(message2.has_optional_double());
    237   EXPECT_EQ(12.3, message2.optional_double());
    238   EXPECT_EQ(2, message2.repeated_int32_size());
    239   EXPECT_EQ(10, message2.repeated_int32(0));
    240   EXPECT_EQ(20, message2.repeated_int32(1));
    241   EXPECT_FALSE(message2.has_optional_string());
    242   EXPECT_EQ(1, message2.repeated_int64_size());
    243   EXPECT_FALSE(message2.has_optional_uint64());
    244 }
    245 
    246 TEST(GeneratedMessageReflectionTest, SwapFieldsAll) {
    247   unittest::TestAllTypes message1;
    248   unittest::TestAllTypes message2;
    249 
    250   TestUtil::SetAllFields(&message2);
    251 
    252   vector<const FieldDescriptor*> fields;
    253   const Reflection* reflection = message1.GetReflection();
    254   reflection->ListFields(message2, &fields);
    255   reflection->SwapFields(&message1, &message2, fields);
    256 
    257   TestUtil::ExpectAllFieldsSet(message1);
    258   TestUtil::ExpectClear(message2);
    259 }
    260 
    261 TEST(GeneratedMessageReflectionTest, SwapFieldsAllExtension) {
    262   unittest::TestAllExtensions message1;
    263   unittest::TestAllExtensions message2;
    264 
    265   TestUtil::SetAllExtensions(&message1);
    266 
    267   vector<const FieldDescriptor*> fields;
    268   const Reflection* reflection = message1.GetReflection();
    269   reflection->ListFields(message1, &fields);
    270   reflection->SwapFields(&message1, &message2, fields);
    271 
    272   TestUtil::ExpectExtensionsClear(message1);
    273   TestUtil::ExpectAllExtensionsSet(message2);
    274 }
    275 
    276 TEST(GeneratedMessageReflectionTest, SwapOneof) {
    277   unittest::TestOneof2 message1, message2;
    278   TestUtil::SetOneof1(&message1);
    279 
    280   const Reflection* reflection = message1.GetReflection();
    281   reflection->Swap(&message1, &message2);
    282 
    283   TestUtil::ExpectOneofClear(message1);
    284   TestUtil::ExpectOneofSet1(message2);
    285 }
    286 
    287 TEST(GeneratedMessageReflectionTest, SwapOneofBothSet) {
    288   unittest::TestOneof2 message1, message2;
    289   TestUtil::SetOneof1(&message1);
    290   TestUtil::SetOneof2(&message2);
    291 
    292   const Reflection* reflection = message1.GetReflection();
    293   reflection->Swap(&message1, &message2);
    294 
    295   TestUtil::ExpectOneofSet2(message1);
    296   TestUtil::ExpectOneofSet1(message2);
    297 }
    298 
    299 TEST(GeneratedMessageReflectionTest, SwapFieldsOneof) {
    300   unittest::TestOneof2 message1, message2;
    301   TestUtil::SetOneof1(&message1);
    302 
    303   vector<const FieldDescriptor*> fields;
    304   const Descriptor* descriptor = message1.GetDescriptor();
    305   for (int i = 0; i < descriptor->field_count(); i++) {
    306     fields.push_back(descriptor->field(i));
    307   }
    308   const Reflection* reflection = message1.GetReflection();
    309   reflection->SwapFields(&message1, &message2, fields);
    310 
    311   TestUtil::ExpectOneofClear(message1);
    312   TestUtil::ExpectOneofSet1(message2);
    313 }
    314 
    315 TEST(GeneratedMessageReflectionTest, RemoveLast) {
    316   unittest::TestAllTypes message;
    317   TestUtil::ReflectionTester reflection_tester(
    318     unittest::TestAllTypes::descriptor());
    319 
    320   TestUtil::SetAllFields(&message);
    321 
    322   reflection_tester.RemoveLastRepeatedsViaReflection(&message);
    323 
    324   TestUtil::ExpectLastRepeatedsRemoved(message);
    325 }
    326 
    327 TEST(GeneratedMessageReflectionTest, RemoveLastExtensions) {
    328   unittest::TestAllExtensions message;
    329   TestUtil::ReflectionTester reflection_tester(
    330     unittest::TestAllExtensions::descriptor());
    331 
    332   TestUtil::SetAllExtensions(&message);
    333 
    334   reflection_tester.RemoveLastRepeatedsViaReflection(&message);
    335 
    336   TestUtil::ExpectLastRepeatedExtensionsRemoved(message);
    337 }
    338 
    339 TEST(GeneratedMessageReflectionTest, ReleaseLast) {
    340   unittest::TestAllTypes message;
    341   const Descriptor* descriptor = message.GetDescriptor();
    342   TestUtil::ReflectionTester reflection_tester(descriptor);
    343 
    344   TestUtil::SetAllFields(&message);
    345 
    346   reflection_tester.ReleaseLastRepeatedsViaReflection(&message, false);
    347 
    348   TestUtil::ExpectLastRepeatedsReleased(message);
    349 
    350   // Now test that we actually release the right message.
    351   message.Clear();
    352   TestUtil::SetAllFields(&message);
    353   ASSERT_EQ(2, message.repeated_foreign_message_size());
    354   const protobuf_unittest::ForeignMessage* expected =
    355       message.mutable_repeated_foreign_message(1);
    356   scoped_ptr<Message> released(message.GetReflection()->ReleaseLast(
    357       &message, descriptor->FindFieldByName("repeated_foreign_message")));
    358   EXPECT_EQ(expected, released.get());
    359 }
    360 
    361 TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) {
    362   unittest::TestAllExtensions message;
    363   const Descriptor* descriptor = message.GetDescriptor();
    364   TestUtil::ReflectionTester reflection_tester(descriptor);
    365 
    366   TestUtil::SetAllExtensions(&message);
    367 
    368   reflection_tester.ReleaseLastRepeatedsViaReflection(&message, true);
    369 
    370   TestUtil::ExpectLastRepeatedExtensionsReleased(message);
    371 
    372   // Now test that we actually release the right message.
    373   message.Clear();
    374   TestUtil::SetAllExtensions(&message);
    375   ASSERT_EQ(2, message.ExtensionSize(
    376       unittest::repeated_foreign_message_extension));
    377   const protobuf_unittest::ForeignMessage* expected = message.MutableExtension(
    378       unittest::repeated_foreign_message_extension, 1);
    379   scoped_ptr<Message> released(message.GetReflection()->ReleaseLast(
    380       &message, descriptor->file()->FindExtensionByName(
    381           "repeated_foreign_message_extension")));
    382   EXPECT_EQ(expected, released.get());
    383 
    384 }
    385 
    386 TEST(GeneratedMessageReflectionTest, SwapRepeatedElements) {
    387   unittest::TestAllTypes message;
    388   TestUtil::ReflectionTester reflection_tester(
    389     unittest::TestAllTypes::descriptor());
    390 
    391   TestUtil::SetAllFields(&message);
    392 
    393   // Swap and test that fields are all swapped.
    394   reflection_tester.SwapRepeatedsViaReflection(&message);
    395   TestUtil::ExpectRepeatedsSwapped(message);
    396 
    397   // Swap back and test that fields are all back to original values.
    398   reflection_tester.SwapRepeatedsViaReflection(&message);
    399   TestUtil::ExpectAllFieldsSet(message);
    400 }
    401 
    402 TEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) {
    403   unittest::TestAllExtensions message;
    404   TestUtil::ReflectionTester reflection_tester(
    405     unittest::TestAllExtensions::descriptor());
    406 
    407   TestUtil::SetAllExtensions(&message);
    408 
    409   // Swap and test that fields are all swapped.
    410   reflection_tester.SwapRepeatedsViaReflection(&message);
    411   TestUtil::ExpectRepeatedExtensionsSwapped(message);
    412 
    413   // Swap back and test that fields are all back to original values.
    414   reflection_tester.SwapRepeatedsViaReflection(&message);
    415   TestUtil::ExpectAllExtensionsSet(message);
    416 }
    417 
    418 TEST(GeneratedMessageReflectionTest, Extensions) {
    419   // Set every extension to a unique value then go back and check all those
    420   // values.
    421   unittest::TestAllExtensions message;
    422   TestUtil::ReflectionTester reflection_tester(
    423     unittest::TestAllExtensions::descriptor());
    424 
    425   reflection_tester.SetAllFieldsViaReflection(&message);
    426   TestUtil::ExpectAllExtensionsSet(message);
    427   reflection_tester.ExpectAllFieldsSetViaReflection(message);
    428 
    429   reflection_tester.ModifyRepeatedFieldsViaReflection(&message);
    430   TestUtil::ExpectRepeatedExtensionsModified(message);
    431 }
    432 
    433 TEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) {
    434   const Reflection* reflection =
    435     unittest::TestAllExtensions::default_instance().GetReflection();
    436 
    437   const FieldDescriptor* extension1 =
    438     unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
    439       "optional_int32_extension");
    440   const FieldDescriptor* extension2 =
    441     unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
    442       "repeated_string_extension");
    443 
    444   EXPECT_EQ(extension1,
    445             reflection->FindKnownExtensionByNumber(extension1->number()));
    446   EXPECT_EQ(extension2,
    447             reflection->FindKnownExtensionByNumber(extension2->number()));
    448 
    449   // Non-existent extension.
    450   EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) == NULL);
    451 
    452   // Extensions of TestAllExtensions should not show up as extensions of
    453   // other types.
    454   EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->
    455               FindKnownExtensionByNumber(extension1->number()) == NULL);
    456 }
    457 
    458 TEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) {
    459   const Reflection* reflection =
    460     unittest::TestAllExtensions::default_instance().GetReflection();
    461 
    462   const FieldDescriptor* extension1 =
    463     unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
    464       "optional_int32_extension");
    465   const FieldDescriptor* extension2 =
    466     unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
    467       "repeated_string_extension");
    468 
    469   EXPECT_EQ(extension1,
    470             reflection->FindKnownExtensionByName(extension1->full_name()));
    471   EXPECT_EQ(extension2,
    472             reflection->FindKnownExtensionByName(extension2->full_name()));
    473 
    474   // Non-existent extension.
    475   EXPECT_TRUE(reflection->FindKnownExtensionByName("no_such_ext") == NULL);
    476 
    477   // Extensions of TestAllExtensions should not show up as extensions of
    478   // other types.
    479   EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->
    480               FindKnownExtensionByName(extension1->full_name()) == NULL);
    481 }
    482 
    483 TEST(GeneratedMessageReflectionTest, SetAllocatedMessageTest) {
    484   unittest::TestAllTypes from_message1;
    485   unittest::TestAllTypes from_message2;
    486   unittest::TestAllTypes to_message;
    487   TestUtil::ReflectionTester reflection_tester(
    488     unittest::TestAllTypes::descriptor());
    489   reflection_tester.SetAllFieldsViaReflection(&from_message1);
    490   reflection_tester.SetAllFieldsViaReflection(&from_message2);
    491 
    492   // Before moving fields, we expect the nested messages to be NULL.
    493   reflection_tester.ExpectMessagesReleasedViaReflection(
    494       &to_message, TestUtil::ReflectionTester::IS_NULL);
    495 
    496   // After fields are moved we should get non-NULL releases.
    497   reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
    498       &from_message1, &to_message);
    499   reflection_tester.ExpectMessagesReleasedViaReflection(
    500       &to_message, TestUtil::ReflectionTester::NOT_NULL);
    501 
    502   // Another move to make sure that we can SetAllocated several times.
    503   reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
    504       &from_message2, &to_message);
    505   reflection_tester.ExpectMessagesReleasedViaReflection(
    506       &to_message, TestUtil::ReflectionTester::NOT_NULL);
    507 
    508   // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
    509   // releases to be NULL again.
    510   reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
    511       &to_message);
    512   reflection_tester.ExpectMessagesReleasedViaReflection(
    513       &to_message, TestUtil::ReflectionTester::IS_NULL);
    514 }
    515 
    516 TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageTest) {
    517   unittest::TestAllExtensions from_message1;
    518   unittest::TestAllExtensions from_message2;
    519   unittest::TestAllExtensions to_message;
    520   TestUtil::ReflectionTester reflection_tester(
    521     unittest::TestAllExtensions::descriptor());
    522   reflection_tester.SetAllFieldsViaReflection(&from_message1);
    523   reflection_tester.SetAllFieldsViaReflection(&from_message2);
    524 
    525   // Before moving fields, we expect the nested messages to be NULL.
    526   reflection_tester.ExpectMessagesReleasedViaReflection(
    527       &to_message, TestUtil::ReflectionTester::IS_NULL);
    528 
    529   // After fields are moved we should get non-NULL releases.
    530   reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
    531       &from_message1, &to_message);
    532   reflection_tester.ExpectMessagesReleasedViaReflection(
    533       &to_message, TestUtil::ReflectionTester::NOT_NULL);
    534 
    535   // Another move to make sure that we can SetAllocated several times.
    536   reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
    537       &from_message2, &to_message);
    538   reflection_tester.ExpectMessagesReleasedViaReflection(
    539       &to_message, TestUtil::ReflectionTester::NOT_NULL);
    540 
    541   // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
    542   // releases to be NULL again.
    543   reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
    544       &to_message);
    545   reflection_tester.ExpectMessagesReleasedViaReflection(
    546       &to_message, TestUtil::ReflectionTester::IS_NULL);
    547 }
    548 
    549 TEST(GeneratedMessageReflectionTest, ListFieldsOneOf) {
    550   unittest::TestOneof2 message;
    551   TestUtil::SetOneof1(&message);
    552 
    553   const Reflection* reflection = message.GetReflection();
    554   vector<const FieldDescriptor*> fields;
    555   reflection->ListFields(message, &fields);
    556   EXPECT_EQ(4, fields.size());
    557 }
    558 
    559 TEST(GeneratedMessageReflectionTest, Oneof) {
    560   unittest::TestOneof2 message;
    561   const Descriptor* descriptor = message.GetDescriptor();
    562   const Reflection* reflection = message.GetReflection();
    563 
    564   // Check default values.
    565   EXPECT_EQ(0, reflection->GetInt32(
    566       message, descriptor->FindFieldByName("foo_int")));
    567   EXPECT_EQ("", reflection->GetString(
    568       message, descriptor->FindFieldByName("foo_string")));
    569   EXPECT_EQ("", reflection->GetString(
    570       message, descriptor->FindFieldByName("foo_cord")));
    571   EXPECT_EQ("", reflection->GetString(
    572       message, descriptor->FindFieldByName("foo_string_piece")));
    573   EXPECT_EQ("", reflection->GetString(
    574       message, descriptor->FindFieldByName("foo_bytes")));
    575   EXPECT_EQ(unittest::TestOneof2::FOO, reflection->GetEnum(
    576       message, descriptor->FindFieldByName("foo_enum"))->number());
    577   EXPECT_EQ(&unittest::TestOneof2::NestedMessage::default_instance(),
    578             &reflection->GetMessage(
    579                 message, descriptor->FindFieldByName("foo_message")));
    580   EXPECT_EQ(&unittest::TestOneof2::FooGroup::default_instance(),
    581             &reflection->GetMessage(
    582                 message, descriptor->FindFieldByName("foogroup")));
    583   EXPECT_NE(&unittest::TestOneof2::FooGroup::default_instance(),
    584             &reflection->GetMessage(
    585                 message, descriptor->FindFieldByName("foo_lazy_message")));
    586   EXPECT_EQ(5, reflection->GetInt32(
    587       message, descriptor->FindFieldByName("bar_int")));
    588   EXPECT_EQ("STRING", reflection->GetString(
    589       message, descriptor->FindFieldByName("bar_string")));
    590   EXPECT_EQ("CORD", reflection->GetString(
    591       message, descriptor->FindFieldByName("bar_cord")));
    592   EXPECT_EQ("SPIECE", reflection->GetString(
    593       message, descriptor->FindFieldByName("bar_string_piece")));
    594   EXPECT_EQ("BYTES", reflection->GetString(
    595       message, descriptor->FindFieldByName("bar_bytes")));
    596   EXPECT_EQ(unittest::TestOneof2::BAR, reflection->GetEnum(
    597       message, descriptor->FindFieldByName("bar_enum"))->number());
    598 
    599   // Check Set functions.
    600   reflection->SetInt32(
    601       &message, descriptor->FindFieldByName("foo_int"), 123);
    602   EXPECT_EQ(123, reflection->GetInt32(
    603       message, descriptor->FindFieldByName("foo_int")));
    604   reflection->SetString(
    605       &message, descriptor->FindFieldByName("foo_string"), "abc");
    606   EXPECT_EQ("abc", reflection->GetString(
    607       message, descriptor->FindFieldByName("foo_string")));
    608   reflection->SetString(
    609       &message, descriptor->FindFieldByName("foo_bytes"), "bytes");
    610   EXPECT_EQ("bytes", reflection->GetString(
    611       message, descriptor->FindFieldByName("foo_bytes")));
    612   reflection->SetString(
    613       &message, descriptor->FindFieldByName("bar_cord"), "change_cord");
    614   EXPECT_EQ("change_cord", reflection->GetString(
    615       message, descriptor->FindFieldByName("bar_cord")));
    616   reflection->SetString(
    617       &message, descriptor->FindFieldByName("bar_string_piece"),
    618       "change_spiece");
    619   EXPECT_EQ("change_spiece", reflection->GetString(
    620       message, descriptor->FindFieldByName("bar_string_piece")));
    621 }
    622 
    623 TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) {
    624   unittest::TestOneof2 from_message1;
    625   unittest::TestOneof2 from_message2;
    626   unittest::TestOneof2 to_message;
    627   const Descriptor* descriptor = unittest::TestOneof2::descriptor();
    628   const Reflection* reflection = to_message.GetReflection();
    629 
    630   Message* released = reflection->ReleaseMessage(
    631       &to_message, descriptor->FindFieldByName("foo_lazy_message"));
    632   EXPECT_TRUE(released == NULL);
    633   released = reflection->ReleaseMessage(
    634       &to_message, descriptor->FindFieldByName("foo_message"));
    635   EXPECT_TRUE(released == NULL);
    636 
    637   TestUtil::ReflectionTester::SetOneofViaReflection(&from_message1);
    638   TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1);
    639 
    640   TestUtil::ReflectionTester::
    641       SetAllocatedOptionalMessageFieldsToMessageViaReflection(
    642           &from_message1, &to_message);
    643   const Message& sub_message = reflection->GetMessage(
    644       to_message, descriptor->FindFieldByName("foo_lazy_message"));
    645   released = reflection->ReleaseMessage(
    646       &to_message, descriptor->FindFieldByName("foo_lazy_message"));
    647   EXPECT_TRUE(released != NULL);
    648   EXPECT_EQ(&sub_message, released);
    649   delete released;
    650 
    651   TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2);
    652 
    653   reflection->MutableMessage(
    654       &from_message2, descriptor->FindFieldByName("foo_message"));
    655 
    656   TestUtil::ReflectionTester::
    657       SetAllocatedOptionalMessageFieldsToMessageViaReflection(
    658           &from_message2, &to_message);
    659 
    660   const Message& sub_message2 = reflection->GetMessage(
    661       to_message, descriptor->FindFieldByName("foo_message"));
    662   released = reflection->ReleaseMessage(
    663       &to_message, descriptor->FindFieldByName("foo_message"));
    664   EXPECT_TRUE(released != NULL);
    665   EXPECT_EQ(&sub_message2, released);
    666   delete released;
    667 }
    668 
    669 TEST(GeneratedMessageReflectionTest, ReleaseMessageTest) {
    670   unittest::TestAllTypes message;
    671   TestUtil::ReflectionTester reflection_tester(
    672     unittest::TestAllTypes::descriptor());
    673 
    674   // When nothing is set, we expect all released messages to be NULL.
    675   reflection_tester.ExpectMessagesReleasedViaReflection(
    676       &message, TestUtil::ReflectionTester::IS_NULL);
    677 
    678   // After fields are set we should get non-NULL releases.
    679   reflection_tester.SetAllFieldsViaReflection(&message);
    680   reflection_tester.ExpectMessagesReleasedViaReflection(
    681       &message, TestUtil::ReflectionTester::NOT_NULL);
    682 
    683   // After Clear() we may or may not get a message from ReleaseMessage().
    684   // This is implementation specific.
    685   reflection_tester.SetAllFieldsViaReflection(&message);
    686   message.Clear();
    687   reflection_tester.ExpectMessagesReleasedViaReflection(
    688       &message, TestUtil::ReflectionTester::CAN_BE_NULL);
    689 
    690   // Test a different code path for setting after releasing.
    691   TestUtil::SetAllFields(&message);
    692   TestUtil::ExpectAllFieldsSet(message);
    693 }
    694 
    695 TEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) {
    696   unittest::TestAllExtensions message;
    697   TestUtil::ReflectionTester reflection_tester(
    698     unittest::TestAllExtensions::descriptor());
    699 
    700   // When nothing is set, we expect all released messages to be NULL.
    701   reflection_tester.ExpectMessagesReleasedViaReflection(
    702       &message, TestUtil::ReflectionTester::IS_NULL);
    703 
    704   // After fields are set we should get non-NULL releases.
    705   reflection_tester.SetAllFieldsViaReflection(&message);
    706   reflection_tester.ExpectMessagesReleasedViaReflection(
    707       &message, TestUtil::ReflectionTester::NOT_NULL);
    708 
    709   // After Clear() we may or may not get a message from ReleaseMessage().
    710   // This is implementation specific.
    711   reflection_tester.SetAllFieldsViaReflection(&message);
    712   message.Clear();
    713   reflection_tester.ExpectMessagesReleasedViaReflection(
    714       &message, TestUtil::ReflectionTester::CAN_BE_NULL);
    715 
    716   // Test a different code path for setting after releasing.
    717   TestUtil::SetAllExtensions(&message);
    718   TestUtil::ExpectAllExtensionsSet(message);
    719 }
    720 
    721 TEST(GeneratedMessageReflectionTest, ReleaseOneofMessageTest) {
    722   unittest::TestOneof2 message;
    723   TestUtil::ReflectionTester::SetOneofViaReflection(&message);
    724 
    725   const Descriptor* descriptor = unittest::TestOneof2::descriptor();
    726   const Reflection* reflection = message.GetReflection();
    727   const Message& sub_message = reflection->GetMessage(
    728       message, descriptor->FindFieldByName("foo_lazy_message"));
    729   Message* released = reflection->ReleaseMessage(
    730       &message, descriptor->FindFieldByName("foo_lazy_message"));
    731 
    732   EXPECT_TRUE(released != NULL);
    733   EXPECT_EQ(&sub_message, released);
    734   delete released;
    735 
    736   released = reflection->ReleaseMessage(
    737       &message, descriptor->FindFieldByName("foo_lazy_message"));
    738   EXPECT_TRUE(released == NULL);
    739 }
    740 
    741 #ifdef PROTOBUF_HAS_DEATH_TEST
    742 
    743 TEST(GeneratedMessageReflectionTest, UsageErrors) {
    744   unittest::TestAllTypes message;
    745   const Reflection* reflection = message.GetReflection();
    746   const Descriptor* descriptor = message.GetDescriptor();
    747 
    748 #define f(NAME) descriptor->FindFieldByName(NAME)
    749 
    750   // Testing every single failure mode would be too much work.  Let's just
    751   // check a few.
    752   EXPECT_DEATH(
    753     reflection->GetInt32(
    754       message, descriptor->FindFieldByName("optional_int64")),
    755     "Protocol Buffer reflection usage error:\n"
    756     "  Method      : google::protobuf::Reflection::GetInt32\n"
    757     "  Message type: protobuf_unittest\\.TestAllTypes\n"
    758     "  Field       : protobuf_unittest\\.TestAllTypes\\.optional_int64\n"
    759     "  Problem     : Field is not the right type for this message:\n"
    760     "    Expected  : CPPTYPE_INT32\n"
    761     "    Field type: CPPTYPE_INT64");
    762   EXPECT_DEATH(
    763     reflection->GetInt32(
    764       message, descriptor->FindFieldByName("repeated_int32")),
    765     "Protocol Buffer reflection usage error:\n"
    766     "  Method      : google::protobuf::Reflection::GetInt32\n"
    767     "  Message type: protobuf_unittest.TestAllTypes\n"
    768     "  Field       : protobuf_unittest.TestAllTypes.repeated_int32\n"
    769     "  Problem     : Field is repeated; the method requires a singular field.");
    770   EXPECT_DEATH(
    771     reflection->GetInt32(
    772       message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
    773     "Protocol Buffer reflection usage error:\n"
    774     "  Method      : google::protobuf::Reflection::GetInt32\n"
    775     "  Message type: protobuf_unittest.TestAllTypes\n"
    776     "  Field       : protobuf_unittest.ForeignMessage.c\n"
    777     "  Problem     : Field does not match message type.");
    778   EXPECT_DEATH(
    779     reflection->HasField(
    780       message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
    781     "Protocol Buffer reflection usage error:\n"
    782     "  Method      : google::protobuf::Reflection::HasField\n"
    783     "  Message type: protobuf_unittest.TestAllTypes\n"
    784     "  Field       : protobuf_unittest.ForeignMessage.c\n"
    785     "  Problem     : Field does not match message type.");
    786 
    787 #undef f
    788 }
    789 
    790 #endif  // PROTOBUF_HAS_DEATH_TEST
    791 
    792 
    793 }  // namespace
    794 }  // namespace protobuf
    795 }  // namespace google
    796