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 #include <google/protobuf/reflection_ops.h>
     36 #include <google/protobuf/descriptor.h>
     37 #include <google/protobuf/unittest.pb.h>
     38 #include <google/protobuf/test_util.h>
     39 
     40 #include <google/protobuf/stubs/logging.h>
     41 #include <google/protobuf/stubs/common.h>
     42 #include <google/protobuf/testing/googletest.h>
     43 #include <gtest/gtest.h>
     44 #include <google/protobuf/stubs/strutil.h>
     45 
     46 namespace google {
     47 namespace protobuf {
     48 namespace internal {
     49 namespace {
     50 
     51 TEST(ReflectionOpsTest, SanityCheck) {
     52   unittest::TestAllTypes message;
     53 
     54   TestUtil::SetAllFields(&message);
     55   TestUtil::ExpectAllFieldsSet(message);
     56 }
     57 
     58 TEST(ReflectionOpsTest, Copy) {
     59   unittest::TestAllTypes message, message2;
     60 
     61   TestUtil::SetAllFields(&message);
     62 
     63   ReflectionOps::Copy(message, &message2);
     64 
     65   TestUtil::ExpectAllFieldsSet(message2);
     66 
     67   // Copying from self should be a no-op.
     68   ReflectionOps::Copy(message2, &message2);
     69   TestUtil::ExpectAllFieldsSet(message2);
     70 }
     71 
     72 TEST(ReflectionOpsTest, CopyExtensions) {
     73   unittest::TestAllExtensions message, message2;
     74 
     75   TestUtil::SetAllExtensions(&message);
     76 
     77   ReflectionOps::Copy(message, &message2);
     78 
     79   TestUtil::ExpectAllExtensionsSet(message2);
     80 }
     81 
     82 TEST(ReflectionOpsTest, CopyOneof) {
     83   unittest::TestOneof2 message, message2;
     84   TestUtil::SetOneof1(&message);
     85   ReflectionOps::Copy(message, &message2);
     86   TestUtil::ExpectOneofSet1(message2);
     87 
     88   TestUtil::SetOneof2(&message);
     89   TestUtil::ExpectOneofSet2(message);
     90   ReflectionOps::Copy(message, &message2);
     91   TestUtil::ExpectOneofSet2(message2);
     92 }
     93 
     94 TEST(ReflectionOpsTest, Merge) {
     95   // Note:  Copy is implemented in terms of Merge() so technically the Copy
     96   //   test already tested most of this.
     97 
     98   unittest::TestAllTypes message, message2;
     99 
    100   TestUtil::SetAllFields(&message);
    101 
    102   // This field will test merging into an empty spot.
    103   message2.set_optional_int32(message.optional_int32());
    104   message.clear_optional_int32();
    105 
    106   // This tests overwriting.
    107   message2.set_optional_string(message.optional_string());
    108   message.set_optional_string("something else");
    109 
    110   // This tests concatenating.
    111   message2.add_repeated_int32(message.repeated_int32(1));
    112   int32 i = message.repeated_int32(0);
    113   message.clear_repeated_int32();
    114   message.add_repeated_int32(i);
    115 
    116   ReflectionOps::Merge(message2, &message);
    117 
    118   TestUtil::ExpectAllFieldsSet(message);
    119 }
    120 
    121 TEST(ReflectionOpsTest, MergeExtensions) {
    122   // Note:  Copy is implemented in terms of Merge() so technically the Copy
    123   //   test already tested most of this.
    124 
    125   unittest::TestAllExtensions message, message2;
    126 
    127   TestUtil::SetAllExtensions(&message);
    128 
    129   // This field will test merging into an empty spot.
    130   message2.SetExtension(unittest::optional_int32_extension,
    131     message.GetExtension(unittest::optional_int32_extension));
    132   message.ClearExtension(unittest::optional_int32_extension);
    133 
    134   // This tests overwriting.
    135   message2.SetExtension(unittest::optional_string_extension,
    136     message.GetExtension(unittest::optional_string_extension));
    137   message.SetExtension(unittest::optional_string_extension, "something else");
    138 
    139   // This tests concatenating.
    140   message2.AddExtension(unittest::repeated_int32_extension,
    141     message.GetExtension(unittest::repeated_int32_extension, 1));
    142   int32 i = message.GetExtension(unittest::repeated_int32_extension, 0);
    143   message.ClearExtension(unittest::repeated_int32_extension);
    144   message.AddExtension(unittest::repeated_int32_extension, i);
    145 
    146   ReflectionOps::Merge(message2, &message);
    147 
    148   TestUtil::ExpectAllExtensionsSet(message);
    149 }
    150 
    151 TEST(ReflectionOpsTest, MergeUnknown) {
    152   // Test that the messages' UnknownFieldSets are correctly merged.
    153   unittest::TestEmptyMessage message1, message2;
    154   message1.mutable_unknown_fields()->AddVarint(1234, 1);
    155   message2.mutable_unknown_fields()->AddVarint(1234, 2);
    156 
    157   ReflectionOps::Merge(message2, &message1);
    158 
    159   ASSERT_EQ(2, message1.unknown_fields().field_count());
    160   ASSERT_EQ(UnknownField::TYPE_VARINT,
    161             message1.unknown_fields().field(0).type());
    162   EXPECT_EQ(1, message1.unknown_fields().field(0).varint());
    163   ASSERT_EQ(UnknownField::TYPE_VARINT,
    164             message1.unknown_fields().field(1).type());
    165   EXPECT_EQ(2, message1.unknown_fields().field(1).varint());
    166 }
    167 
    168 TEST(ReflectionOpsTest, MergeOneof) {
    169   unittest::TestOneof2 message1, message2;
    170   TestUtil::SetOneof1(&message1);
    171 
    172   // Merge to empty message
    173   ReflectionOps::Merge(message1, &message2);
    174   TestUtil::ExpectOneofSet1(message2);
    175 
    176   // Merge with the same oneof fields
    177   ReflectionOps::Merge(message1, &message2);
    178   TestUtil::ExpectOneofSet1(message2);
    179 
    180   // Merge with different oneof fields
    181   TestUtil::SetOneof2(&message1);
    182   ReflectionOps::Merge(message1, &message2);
    183   TestUtil::ExpectOneofSet2(message2);
    184 }
    185 
    186 #ifdef PROTOBUF_HAS_DEATH_TEST
    187 
    188 TEST(ReflectionOpsTest, MergeFromSelf) {
    189   // Note:  Copy is implemented in terms of Merge() so technically the Copy
    190   //   test already tested most of this.
    191 
    192   unittest::TestAllTypes message;
    193 
    194   EXPECT_DEATH(
    195     ReflectionOps::Merge(message, &message),
    196     "&from");
    197 }
    198 
    199 #endif  // PROTOBUF_HAS_DEATH_TEST
    200 
    201 TEST(ReflectionOpsTest, Clear) {
    202   unittest::TestAllTypes message;
    203 
    204   TestUtil::SetAllFields(&message);
    205 
    206   ReflectionOps::Clear(&message);
    207 
    208   TestUtil::ExpectClear(message);
    209 
    210   // Check that getting embedded messages returns the objects created during
    211   // SetAllFields() rather than default instances.
    212   EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),
    213             &message.optionalgroup());
    214   EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
    215             &message.optional_nested_message());
    216   EXPECT_NE(&unittest::ForeignMessage::default_instance(),
    217             &message.optional_foreign_message());
    218   EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
    219             &message.optional_import_message());
    220 }
    221 
    222 TEST(ReflectionOpsTest, ClearExtensions) {
    223   unittest::TestAllExtensions message;
    224 
    225   TestUtil::SetAllExtensions(&message);
    226 
    227   ReflectionOps::Clear(&message);
    228 
    229   TestUtil::ExpectExtensionsClear(message);
    230 
    231   // Check that getting embedded messages returns the objects created during
    232   // SetAllExtensions() rather than default instances.
    233   EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(),
    234             &message.GetExtension(unittest::optionalgroup_extension));
    235   EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
    236             &message.GetExtension(unittest::optional_nested_message_extension));
    237   EXPECT_NE(&unittest::ForeignMessage::default_instance(),
    238             &message.GetExtension(
    239               unittest::optional_foreign_message_extension));
    240   EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
    241             &message.GetExtension(unittest::optional_import_message_extension));
    242 }
    243 
    244 TEST(ReflectionOpsTest, ClearUnknown) {
    245   // Test that the message's UnknownFieldSet is correctly cleared.
    246   unittest::TestEmptyMessage message;
    247   message.mutable_unknown_fields()->AddVarint(1234, 1);
    248 
    249   ReflectionOps::Clear(&message);
    250 
    251   EXPECT_EQ(0, message.unknown_fields().field_count());
    252 }
    253 
    254 TEST(ReflectionOpsTest, ClearOneof) {
    255   unittest::TestOneof2 message;
    256 
    257   TestUtil::ExpectOneofClear(message);
    258   TestUtil::SetOneof1(&message);
    259   TestUtil::ExpectOneofSet1(message);
    260   ReflectionOps::Clear(&message);
    261   TestUtil::ExpectOneofClear(message);
    262 
    263   TestUtil::SetOneof1(&message);
    264   TestUtil::ExpectOneofSet1(message);
    265   TestUtil::SetOneof2(&message);
    266   TestUtil::ExpectOneofSet2(message);
    267   ReflectionOps::Clear(&message);
    268   TestUtil::ExpectOneofClear(message);
    269 }
    270 
    271 TEST(ReflectionOpsTest, DiscardUnknownFields) {
    272   unittest::TestAllTypes message;
    273   TestUtil::SetAllFields(&message);
    274 
    275   // Set some unknown fields in message.
    276   message.mutable_unknown_fields()
    277         ->AddVarint(123456, 654321);
    278   message.mutable_optional_nested_message()
    279         ->mutable_unknown_fields()
    280         ->AddVarint(123456, 654321);
    281   message.mutable_repeated_nested_message(0)
    282         ->mutable_unknown_fields()
    283         ->AddVarint(123456, 654321);
    284 
    285   EXPECT_EQ(1, message.unknown_fields().field_count());
    286   EXPECT_EQ(1, message.optional_nested_message()
    287                       .unknown_fields().field_count());
    288   EXPECT_EQ(1, message.repeated_nested_message(0)
    289                       .unknown_fields().field_count());
    290 
    291   // Discard them.
    292   ReflectionOps::DiscardUnknownFields(&message);
    293   TestUtil::ExpectAllFieldsSet(message);
    294 
    295   EXPECT_EQ(0, message.unknown_fields().field_count());
    296   EXPECT_EQ(0, message.optional_nested_message()
    297                       .unknown_fields().field_count());
    298   EXPECT_EQ(0, message.repeated_nested_message(0)
    299                       .unknown_fields().field_count());
    300 }
    301 
    302 TEST(ReflectionOpsTest, DiscardUnknownExtensions) {
    303   unittest::TestAllExtensions message;
    304   TestUtil::SetAllExtensions(&message);
    305 
    306   // Set some unknown fields.
    307   message.mutable_unknown_fields()
    308         ->AddVarint(123456, 654321);
    309   message.MutableExtension(unittest::optional_nested_message_extension)
    310         ->mutable_unknown_fields()
    311         ->AddVarint(123456, 654321);
    312   message.MutableExtension(unittest::repeated_nested_message_extension, 0)
    313         ->mutable_unknown_fields()
    314         ->AddVarint(123456, 654321);
    315 
    316   EXPECT_EQ(1, message.unknown_fields().field_count());
    317   EXPECT_EQ(1,
    318     message.GetExtension(unittest::optional_nested_message_extension)
    319            .unknown_fields().field_count());
    320   EXPECT_EQ(1,
    321     message.GetExtension(unittest::repeated_nested_message_extension, 0)
    322            .unknown_fields().field_count());
    323 
    324   // Discard them.
    325   ReflectionOps::DiscardUnknownFields(&message);
    326   TestUtil::ExpectAllExtensionsSet(message);
    327 
    328   EXPECT_EQ(0, message.unknown_fields().field_count());
    329   EXPECT_EQ(0,
    330     message.GetExtension(unittest::optional_nested_message_extension)
    331            .unknown_fields().field_count());
    332   EXPECT_EQ(0,
    333     message.GetExtension(unittest::repeated_nested_message_extension, 0)
    334            .unknown_fields().field_count());
    335 }
    336 
    337 TEST(ReflectionOpsTest, IsInitialized) {
    338   unittest::TestRequired message;
    339 
    340   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    341   message.set_a(1);
    342   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    343   message.set_b(2);
    344   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    345   message.set_c(3);
    346   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    347 }
    348 
    349 TEST(ReflectionOpsTest, ForeignIsInitialized) {
    350   unittest::TestRequiredForeign message;
    351 
    352   // Starts out initialized because the foreign message is itself an optional
    353   // field.
    354   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    355 
    356   // Once we create that field, the message is no longer initialized.
    357   message.mutable_optional_message();
    358   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    359 
    360   // Initialize it.  Now we're initialized.
    361   message.mutable_optional_message()->set_a(1);
    362   message.mutable_optional_message()->set_b(2);
    363   message.mutable_optional_message()->set_c(3);
    364   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    365 
    366   // Add a repeated version of the message.  No longer initialized.
    367   unittest::TestRequired* sub_message = message.add_repeated_message();
    368   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    369 
    370   // Initialize that repeated version.
    371   sub_message->set_a(1);
    372   sub_message->set_b(2);
    373   sub_message->set_c(3);
    374   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    375 }
    376 
    377 TEST(ReflectionOpsTest, ExtensionIsInitialized) {
    378   unittest::TestAllExtensions message;
    379 
    380   // Starts out initialized because the foreign message is itself an optional
    381   // field.
    382   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    383 
    384   // Once we create that field, the message is no longer initialized.
    385   message.MutableExtension(unittest::TestRequired::single);
    386   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    387 
    388   // Initialize it.  Now we're initialized.
    389   message.MutableExtension(unittest::TestRequired::single)->set_a(1);
    390   message.MutableExtension(unittest::TestRequired::single)->set_b(2);
    391   message.MutableExtension(unittest::TestRequired::single)->set_c(3);
    392   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    393 
    394   // Add a repeated version of the message.  No longer initialized.
    395   message.AddExtension(unittest::TestRequired::multi);
    396   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    397 
    398   // Initialize that repeated version.
    399   message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1);
    400   message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2);
    401   message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3);
    402   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    403 }
    404 
    405 TEST(ReflectionOpsTest, OneofIsInitialized) {
    406   unittest::TestRequiredOneof message;
    407   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    408 
    409   message.mutable_foo_message();
    410   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    411 
    412   message.set_foo_int(1);
    413   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    414 
    415   message.mutable_foo_message();
    416   EXPECT_FALSE(ReflectionOps::IsInitialized(message));
    417   message.mutable_foo_message()->set_required_double(0.1);
    418   EXPECT_TRUE(ReflectionOps::IsInitialized(message));
    419 }
    420 
    421 static string FindInitializationErrors(const Message& message) {
    422   vector<string> errors;
    423   ReflectionOps::FindInitializationErrors(message, "", &errors);
    424   return Join(errors, ",");
    425 }
    426 
    427 TEST(ReflectionOpsTest, FindInitializationErrors) {
    428   unittest::TestRequired message;
    429   EXPECT_EQ("a,b,c", FindInitializationErrors(message));
    430 }
    431 
    432 TEST(ReflectionOpsTest, FindForeignInitializationErrors) {
    433   unittest::TestRequiredForeign message;
    434   message.mutable_optional_message();
    435   message.add_repeated_message();
    436   message.add_repeated_message();
    437   EXPECT_EQ("optional_message.a,"
    438             "optional_message.b,"
    439             "optional_message.c,"
    440             "repeated_message[0].a,"
    441             "repeated_message[0].b,"
    442             "repeated_message[0].c,"
    443             "repeated_message[1].a,"
    444             "repeated_message[1].b,"
    445             "repeated_message[1].c",
    446             FindInitializationErrors(message));
    447 }
    448 
    449 TEST(ReflectionOpsTest, FindExtensionInitializationErrors) {
    450   unittest::TestAllExtensions message;
    451   message.MutableExtension(unittest::TestRequired::single);
    452   message.AddExtension(unittest::TestRequired::multi);
    453   message.AddExtension(unittest::TestRequired::multi);
    454   EXPECT_EQ("(protobuf_unittest.TestRequired.single).a,"
    455             "(protobuf_unittest.TestRequired.single).b,"
    456             "(protobuf_unittest.TestRequired.single).c,"
    457             "(protobuf_unittest.TestRequired.multi)[0].a,"
    458             "(protobuf_unittest.TestRequired.multi)[0].b,"
    459             "(protobuf_unittest.TestRequired.multi)[0].c,"
    460             "(protobuf_unittest.TestRequired.multi)[1].a,"
    461             "(protobuf_unittest.TestRequired.multi)[1].b,"
    462             "(protobuf_unittest.TestRequired.multi)[1].c",
    463             FindInitializationErrors(message));
    464 }
    465 
    466 TEST(ReflectionOpsTest, FindOneofInitializationErrors) {
    467   unittest::TestRequiredOneof message;
    468   message.mutable_foo_message();
    469   EXPECT_EQ("foo_message.required_double",
    470             FindInitializationErrors(message));
    471 }
    472 
    473 }  // namespace
    474 }  // namespace internal
    475 }  // namespace protobuf
    476 }  // namespace google
    477