Home | History | Annotate | Download | only in cpp
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // http://code.google.com/p/protobuf/
      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 the code generator, we actually use it to generate code for
     36 // google/protobuf/unittest.proto, then test that.  This means that we
     37 // are actually testing the parser and other parts of the system at the same
     38 // time, and that problems in the generator may show up as compile-time errors
     39 // rather than unittest failures, which may be surprising.  However, testing
     40 // the output of the C++ generator directly would be very hard.  We can't very
     41 // well just check it against golden files since those files would have to be
     42 // updated for any small change; such a test would be very brittle and probably
     43 // not very helpful.  What we really want to test is that the code compiles
     44 // correctly and produces the interfaces we expect, which is why this test
     45 // is written this way.
     46 
     47 #include <vector>
     48 
     49 #include <google/protobuf/unittest.pb.h>
     50 #include <google/protobuf/unittest_optimize_for.pb.h>
     51 #include <google/protobuf/unittest_embed_optimize_for.pb.h>
     52 #include <google/protobuf/unittest_no_generic_services.pb.h>
     53 #include <google/protobuf/test_util.h>
     54 #include <google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h>
     55 #include <google/protobuf/compiler/importer.h>
     56 #include <google/protobuf/io/coded_stream.h>
     57 #include <google/protobuf/io/zero_copy_stream_impl.h>
     58 #include <google/protobuf/descriptor.h>
     59 #include <google/protobuf/descriptor.pb.h>
     60 #include <google/protobuf/dynamic_message.h>
     61 
     62 #include <google/protobuf/stubs/common.h>
     63 #include <google/protobuf/stubs/strutil.h>
     64 #include <google/protobuf/stubs/substitute.h>
     65 #include <google/protobuf/testing/googletest.h>
     66 #include <gtest/gtest.h>
     67 #include <google/protobuf/stubs/stl_util-inl.h>
     68 
     69 namespace google {
     70 namespace protobuf {
     71 namespace compiler {
     72 namespace cpp {
     73 
     74 // Can't use an anonymous namespace here due to brokenness of Tru64 compiler.
     75 namespace cpp_unittest {
     76 
     77 
     78 class MockErrorCollector : public MultiFileErrorCollector {
     79  public:
     80   MockErrorCollector() {}
     81   ~MockErrorCollector() {}
     82 
     83   string text_;
     84 
     85   // implements ErrorCollector ---------------------------------------
     86   void AddError(const string& filename, int line, int column,
     87                 const string& message) {
     88     strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n",
     89                                  filename, line, column, message);
     90   }
     91 };
     92 
     93 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
     94 
     95 // Test that generated code has proper descriptors:
     96 // Parse a descriptor directly (using google::protobuf::compiler::Importer) and
     97 // compare it to the one that was produced by generated code.
     98 TEST(GeneratedDescriptorTest, IdenticalDescriptors) {
     99   const FileDescriptor* generated_descriptor =
    100     unittest::TestAllTypes::descriptor()->file();
    101 
    102   // Set up the Importer.
    103   MockErrorCollector error_collector;
    104   DiskSourceTree source_tree;
    105   source_tree.MapPath("", TestSourceDir());
    106   Importer importer(&source_tree, &error_collector);
    107 
    108   // Import (parse) unittest.proto.
    109   const FileDescriptor* parsed_descriptor =
    110     importer.Import("google/protobuf/unittest.proto");
    111   EXPECT_EQ("", error_collector.text_);
    112   ASSERT_TRUE(parsed_descriptor != NULL);
    113 
    114   // Test that descriptors are generated correctly by converting them to
    115   // FileDescriptorProtos and comparing.
    116   FileDescriptorProto generated_decsriptor_proto, parsed_descriptor_proto;
    117   generated_descriptor->CopyTo(&generated_decsriptor_proto);
    118   parsed_descriptor->CopyTo(&parsed_descriptor_proto);
    119 
    120   EXPECT_EQ(parsed_descriptor_proto.DebugString(),
    121             generated_decsriptor_proto.DebugString());
    122 }
    123 
    124 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
    125 
    126 // ===================================================================
    127 
    128 TEST(GeneratedMessageTest, Defaults) {
    129   // Check that all default values are set correctly in the initial message.
    130   unittest::TestAllTypes message;
    131 
    132   TestUtil::ExpectClear(message);
    133 
    134   // Messages should return pointers to default instances until first use.
    135   // (This is not checked by ExpectClear() since it is not actually true after
    136   // the fields have been set and then cleared.)
    137   EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(),
    138             &message.optionalgroup());
    139   EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),
    140             &message.optional_nested_message());
    141   EXPECT_EQ(&unittest::ForeignMessage::default_instance(),
    142             &message.optional_foreign_message());
    143   EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),
    144             &message.optional_import_message());
    145 }
    146 
    147 TEST(GeneratedMessageTest, FloatingPointDefaults) {
    148   const unittest::TestExtremeDefaultValues& extreme_default =
    149       unittest::TestExtremeDefaultValues::default_instance();
    150 
    151   EXPECT_EQ(0.0f, extreme_default.zero_float());
    152   EXPECT_EQ(1.0f, extreme_default.one_float());
    153   EXPECT_EQ(1.5f, extreme_default.small_float());
    154   EXPECT_EQ(-1.0f, extreme_default.negative_one_float());
    155   EXPECT_EQ(-1.5f, extreme_default.negative_float());
    156   EXPECT_EQ(2.0e8f, extreme_default.large_float());
    157   EXPECT_EQ(-8e-28f, extreme_default.small_negative_float());
    158   EXPECT_EQ(numeric_limits<double>::infinity(),
    159             extreme_default.inf_double());
    160   EXPECT_EQ(-numeric_limits<double>::infinity(),
    161             extreme_default.neg_inf_double());
    162   EXPECT_TRUE(extreme_default.nan_double() != extreme_default.nan_double());
    163   EXPECT_EQ(numeric_limits<float>::infinity(),
    164             extreme_default.inf_float());
    165   EXPECT_EQ(-numeric_limits<float>::infinity(),
    166             extreme_default.neg_inf_float());
    167   EXPECT_TRUE(extreme_default.nan_float() != extreme_default.nan_float());
    168 }
    169 
    170 TEST(GeneratedMessageTest, Accessors) {
    171   // Set every field to a unique value then go back and check all those
    172   // values.
    173   unittest::TestAllTypes message;
    174 
    175   TestUtil::SetAllFields(&message);
    176   TestUtil::ExpectAllFieldsSet(message);
    177 
    178   TestUtil::ModifyRepeatedFields(&message);
    179   TestUtil::ExpectRepeatedFieldsModified(message);
    180 }
    181 
    182 TEST(GeneratedMessageTest, MutableStringDefault) {
    183   // mutable_foo() for a string should return a string initialized to its
    184   // default value.
    185   unittest::TestAllTypes message;
    186 
    187   EXPECT_EQ("hello", *message.mutable_default_string());
    188 
    189   // Note that the first time we call mutable_foo(), we get a newly-allocated
    190   // string, but if we clear it and call it again, we get the same object again.
    191   // We should verify that it has its default value in both cases.
    192   message.set_default_string("blah");
    193   message.Clear();
    194 
    195   EXPECT_EQ("hello", *message.mutable_default_string());
    196 }
    197 
    198 TEST(GeneratedMessageTest, Clear) {
    199   // Set every field to a unique value, clear the message, then check that
    200   // it is cleared.
    201   unittest::TestAllTypes message;
    202 
    203   TestUtil::SetAllFields(&message);
    204   message.Clear();
    205   TestUtil::ExpectClear(message);
    206 
    207   // Unlike with the defaults test, we do NOT expect that requesting embedded
    208   // messages will return a pointer to the default instance.  Instead, they
    209   // should return the objects that were created when mutable_blah() was
    210   // called.
    211   EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),
    212             &message.optionalgroup());
    213   EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
    214             &message.optional_nested_message());
    215   EXPECT_NE(&unittest::ForeignMessage::default_instance(),
    216             &message.optional_foreign_message());
    217   EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
    218             &message.optional_import_message());
    219 }
    220 
    221 TEST(GeneratedMessageTest, EmbeddedNullsInBytesCharStar) {
    222   unittest::TestAllTypes message;
    223 
    224   const char* value = "\0lalala\0\0";
    225   message.set_optional_bytes(value, 9);
    226   ASSERT_EQ(9, message.optional_bytes().size());
    227   EXPECT_EQ(0, memcmp(value, message.optional_bytes().data(), 9));
    228 
    229   message.add_repeated_bytes(value, 9);
    230   ASSERT_EQ(9, message.repeated_bytes(0).size());
    231   EXPECT_EQ(0, memcmp(value, message.repeated_bytes(0).data(), 9));
    232 }
    233 
    234 TEST(GeneratedMessageTest, ClearOneField) {
    235   // Set every field to a unique value, then clear one value and insure that
    236   // only that one value is cleared.
    237   unittest::TestAllTypes message;
    238 
    239   TestUtil::SetAllFields(&message);
    240   int64 original_value = message.optional_int64();
    241 
    242   // Clear the field and make sure it shows up as cleared.
    243   message.clear_optional_int64();
    244   EXPECT_FALSE(message.has_optional_int64());
    245   EXPECT_EQ(0, message.optional_int64());
    246 
    247   // Other adjacent fields should not be cleared.
    248   EXPECT_TRUE(message.has_optional_int32());
    249   EXPECT_TRUE(message.has_optional_uint32());
    250 
    251   // Make sure if we set it again, then all fields are set.
    252   message.set_optional_int64(original_value);
    253   TestUtil::ExpectAllFieldsSet(message);
    254 }
    255 
    256 TEST(GeneratedMessageTest, StringCharStarLength) {
    257   // Verify that we can use a char*,length to set one of the string fields.
    258   unittest::TestAllTypes message;
    259   message.set_optional_string("abcdef", 3);
    260   EXPECT_EQ("abc", message.optional_string());
    261 
    262   // Verify that we can use a char*,length to add to a repeated string field.
    263   message.add_repeated_string("abcdef", 3);
    264   EXPECT_EQ(1, message.repeated_string_size());
    265   EXPECT_EQ("abc", message.repeated_string(0));
    266 
    267   // Verify that we can use a char*,length to set a repeated string field.
    268   message.set_repeated_string(0, "wxyz", 2);
    269   EXPECT_EQ("wx", message.repeated_string(0));
    270 }
    271 
    272 
    273 TEST(GeneratedMessageTest, CopyFrom) {
    274   unittest::TestAllTypes message1, message2;
    275 
    276   TestUtil::SetAllFields(&message1);
    277   message2.CopyFrom(message1);
    278   TestUtil::ExpectAllFieldsSet(message2);
    279 
    280   // Copying from self should be a no-op.
    281   message2.CopyFrom(message2);
    282   TestUtil::ExpectAllFieldsSet(message2);
    283 }
    284 
    285 TEST(GeneratedMessageTest, SwapWithEmpty) {
    286   unittest::TestAllTypes message1, message2;
    287   TestUtil::SetAllFields(&message1);
    288 
    289   TestUtil::ExpectAllFieldsSet(message1);
    290   TestUtil::ExpectClear(message2);
    291   message1.Swap(&message2);
    292   TestUtil::ExpectAllFieldsSet(message2);
    293   TestUtil::ExpectClear(message1);
    294 }
    295 
    296 TEST(GeneratedMessageTest, SwapWithSelf) {
    297   unittest::TestAllTypes message;
    298   TestUtil::SetAllFields(&message);
    299   TestUtil::ExpectAllFieldsSet(message);
    300   message.Swap(&message);
    301   TestUtil::ExpectAllFieldsSet(message);
    302 }
    303 
    304 TEST(GeneratedMessageTest, SwapWithOther) {
    305   unittest::TestAllTypes message1, message2;
    306 
    307   message1.set_optional_int32(123);
    308   message1.set_optional_string("abc");
    309   message1.mutable_optional_nested_message()->set_bb(1);
    310   message1.set_optional_nested_enum(unittest::TestAllTypes::FOO);
    311   message1.add_repeated_int32(1);
    312   message1.add_repeated_int32(2);
    313   message1.add_repeated_string("a");
    314   message1.add_repeated_string("b");
    315   message1.add_repeated_nested_message()->set_bb(7);
    316   message1.add_repeated_nested_message()->set_bb(8);
    317   message1.add_repeated_nested_enum(unittest::TestAllTypes::FOO);
    318   message1.add_repeated_nested_enum(unittest::TestAllTypes::BAR);
    319 
    320   message2.set_optional_int32(456);
    321   message2.set_optional_string("def");
    322   message2.mutable_optional_nested_message()->set_bb(2);
    323   message2.set_optional_nested_enum(unittest::TestAllTypes::BAR);
    324   message2.add_repeated_int32(3);
    325   message2.add_repeated_string("c");
    326   message2.add_repeated_nested_message()->set_bb(9);
    327   message2.add_repeated_nested_enum(unittest::TestAllTypes::BAZ);
    328 
    329   message1.Swap(&message2);
    330 
    331   EXPECT_EQ(456, message1.optional_int32());
    332   EXPECT_EQ("def", message1.optional_string());
    333   EXPECT_EQ(2, message1.optional_nested_message().bb());
    334   EXPECT_EQ(unittest::TestAllTypes::BAR, message1.optional_nested_enum());
    335   ASSERT_EQ(1, message1.repeated_int32_size());
    336   EXPECT_EQ(3, message1.repeated_int32(0));
    337   ASSERT_EQ(1, message1.repeated_string_size());
    338   EXPECT_EQ("c", message1.repeated_string(0));
    339   ASSERT_EQ(1, message1.repeated_nested_message_size());
    340   EXPECT_EQ(9, message1.repeated_nested_message(0).bb());
    341   ASSERT_EQ(1, message1.repeated_nested_enum_size());
    342   EXPECT_EQ(unittest::TestAllTypes::BAZ, message1.repeated_nested_enum(0));
    343 
    344   EXPECT_EQ(123, message2.optional_int32());
    345   EXPECT_EQ("abc", message2.optional_string());
    346   EXPECT_EQ(1, message2.optional_nested_message().bb());
    347   EXPECT_EQ(unittest::TestAllTypes::FOO, message2.optional_nested_enum());
    348   ASSERT_EQ(2, message2.repeated_int32_size());
    349   EXPECT_EQ(1, message2.repeated_int32(0));
    350   EXPECT_EQ(2, message2.repeated_int32(1));
    351   ASSERT_EQ(2, message2.repeated_string_size());
    352   EXPECT_EQ("a", message2.repeated_string(0));
    353   EXPECT_EQ("b", message2.repeated_string(1));
    354   ASSERT_EQ(2, message2.repeated_nested_message_size());
    355   EXPECT_EQ(7, message2.repeated_nested_message(0).bb());
    356   EXPECT_EQ(8, message2.repeated_nested_message(1).bb());
    357   ASSERT_EQ(2, message2.repeated_nested_enum_size());
    358   EXPECT_EQ(unittest::TestAllTypes::FOO, message2.repeated_nested_enum(0));
    359   EXPECT_EQ(unittest::TestAllTypes::BAR, message2.repeated_nested_enum(1));
    360 }
    361 
    362 TEST(GeneratedMessageTest, CopyConstructor) {
    363   unittest::TestAllTypes message1;
    364   TestUtil::SetAllFields(&message1);
    365 
    366   unittest::TestAllTypes message2(message1);
    367   TestUtil::ExpectAllFieldsSet(message2);
    368 }
    369 
    370 TEST(GeneratedMessageTest, CopyAssignmentOperator) {
    371   unittest::TestAllTypes message1;
    372   TestUtil::SetAllFields(&message1);
    373 
    374   unittest::TestAllTypes message2;
    375   message2 = message1;
    376   TestUtil::ExpectAllFieldsSet(message2);
    377 
    378   // Make sure that self-assignment does something sane.
    379   message2 = message2;
    380   TestUtil::ExpectAllFieldsSet(message2);
    381 }
    382 
    383 TEST(GeneratedMessageTest, UpcastCopyFrom) {
    384   // Test the CopyFrom method that takes in the generic const Message&
    385   // parameter.
    386   unittest::TestAllTypes message1, message2;
    387 
    388   TestUtil::SetAllFields(&message1);
    389 
    390   const Message* source = implicit_cast<const Message*>(&message1);
    391   message2.CopyFrom(*source);
    392 
    393   TestUtil::ExpectAllFieldsSet(message2);
    394 }
    395 
    396 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    397 
    398 TEST(GeneratedMessageTest, DynamicMessageCopyFrom) {
    399   // Test copying from a DynamicMessage, which must fall back to using
    400   // reflection.
    401   unittest::TestAllTypes message2;
    402 
    403   // Construct a new version of the dynamic message via the factory.
    404   DynamicMessageFactory factory;
    405   scoped_ptr<Message> message1;
    406   message1.reset(factory.GetPrototype(
    407                      unittest::TestAllTypes::descriptor())->New());
    408 
    409   TestUtil::ReflectionTester reflection_tester(
    410     unittest::TestAllTypes::descriptor());
    411   reflection_tester.SetAllFieldsViaReflection(message1.get());
    412 
    413   message2.CopyFrom(*message1);
    414 
    415   TestUtil::ExpectAllFieldsSet(message2);
    416 }
    417 
    418 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
    419 
    420 TEST(GeneratedMessageTest, NonEmptyMergeFrom) {
    421   // Test merging with a non-empty message. Code is a modified form
    422   // of that found in google/protobuf/reflection_ops_unittest.cc.
    423   unittest::TestAllTypes message1, message2;
    424 
    425   TestUtil::SetAllFields(&message1);
    426 
    427   // This field will test merging into an empty spot.
    428   message2.set_optional_int32(message1.optional_int32());
    429   message1.clear_optional_int32();
    430 
    431   // This tests overwriting.
    432   message2.set_optional_string(message1.optional_string());
    433   message1.set_optional_string("something else");
    434 
    435   // This tests concatenating.
    436   message2.add_repeated_int32(message1.repeated_int32(1));
    437   int32 i = message1.repeated_int32(0);
    438   message1.clear_repeated_int32();
    439   message1.add_repeated_int32(i);
    440 
    441   message1.MergeFrom(message2);
    442 
    443   TestUtil::ExpectAllFieldsSet(message1);
    444 }
    445 
    446 #ifdef GTEST_HAS_DEATH_TEST
    447 
    448 TEST(GeneratedMessageTest, MergeFromSelf) {
    449   unittest::TestAllTypes message;
    450   EXPECT_DEATH(message.MergeFrom(message), "&from");
    451   EXPECT_DEATH(message.MergeFrom(implicit_cast<const Message&>(message)),
    452                "&from");
    453 }
    454 
    455 #endif  // GTEST_HAS_DEATH_TEST
    456 
    457 // Test the generated SerializeWithCachedSizesToArray(),
    458 TEST(GeneratedMessageTest, SerializationToArray) {
    459   unittest::TestAllTypes message1, message2;
    460   string data;
    461   TestUtil::SetAllFields(&message1);
    462   int size = message1.ByteSize();
    463   data.resize(size);
    464   uint8* start = reinterpret_cast<uint8*>(string_as_array(&data));
    465   uint8* end = message1.SerializeWithCachedSizesToArray(start);
    466   EXPECT_EQ(size, end - start);
    467   EXPECT_TRUE(message2.ParseFromString(data));
    468   TestUtil::ExpectAllFieldsSet(message2);
    469 
    470 }
    471 
    472 TEST(GeneratedMessageTest, PackedFieldsSerializationToArray) {
    473   unittest::TestPackedTypes packed_message1, packed_message2;
    474   string packed_data;
    475   TestUtil::SetPackedFields(&packed_message1);
    476   int packed_size = packed_message1.ByteSize();
    477   packed_data.resize(packed_size);
    478   uint8* start = reinterpret_cast<uint8*>(string_as_array(&packed_data));
    479   uint8* end = packed_message1.SerializeWithCachedSizesToArray(start);
    480   EXPECT_EQ(packed_size, end - start);
    481   EXPECT_TRUE(packed_message2.ParseFromString(packed_data));
    482   TestUtil::ExpectPackedFieldsSet(packed_message2);
    483 }
    484 
    485 // Test the generated SerializeWithCachedSizes() by forcing the buffer to write
    486 // one byte at a time.
    487 TEST(GeneratedMessageTest, SerializationToStream) {
    488   unittest::TestAllTypes message1, message2;
    489   TestUtil::SetAllFields(&message1);
    490   int size = message1.ByteSize();
    491   string data;
    492   data.resize(size);
    493   {
    494     // Allow the output stream to buffer only one byte at a time.
    495     io::ArrayOutputStream array_stream(string_as_array(&data), size, 1);
    496     io::CodedOutputStream output_stream(&array_stream);
    497     message1.SerializeWithCachedSizes(&output_stream);
    498     EXPECT_FALSE(output_stream.HadError());
    499     EXPECT_EQ(size, output_stream.ByteCount());
    500   }
    501   EXPECT_TRUE(message2.ParseFromString(data));
    502   TestUtil::ExpectAllFieldsSet(message2);
    503 
    504 }
    505 
    506 TEST(GeneratedMessageTest, PackedFieldsSerializationToStream) {
    507   unittest::TestPackedTypes message1, message2;
    508   TestUtil::SetPackedFields(&message1);
    509   int size = message1.ByteSize();
    510   string data;
    511   data.resize(size);
    512   {
    513     // Allow the output stream to buffer only one byte at a time.
    514     io::ArrayOutputStream array_stream(string_as_array(&data), size, 1);
    515     io::CodedOutputStream output_stream(&array_stream);
    516     message1.SerializeWithCachedSizes(&output_stream);
    517     EXPECT_FALSE(output_stream.HadError());
    518     EXPECT_EQ(size, output_stream.ByteCount());
    519   }
    520   EXPECT_TRUE(message2.ParseFromString(data));
    521   TestUtil::ExpectPackedFieldsSet(message2);
    522 }
    523 
    524 
    525 TEST(GeneratedMessageTest, Required) {
    526   // Test that IsInitialized() returns false if required fields are missing.
    527   unittest::TestRequired message;
    528 
    529   EXPECT_FALSE(message.IsInitialized());
    530   message.set_a(1);
    531   EXPECT_FALSE(message.IsInitialized());
    532   message.set_b(2);
    533   EXPECT_FALSE(message.IsInitialized());
    534   message.set_c(3);
    535   EXPECT_TRUE(message.IsInitialized());
    536 }
    537 
    538 TEST(GeneratedMessageTest, RequiredForeign) {
    539   // Test that IsInitialized() returns false if required fields in nested
    540   // messages are missing.
    541   unittest::TestRequiredForeign message;
    542 
    543   EXPECT_TRUE(message.IsInitialized());
    544 
    545   message.mutable_optional_message();
    546   EXPECT_FALSE(message.IsInitialized());
    547 
    548   message.mutable_optional_message()->set_a(1);
    549   message.mutable_optional_message()->set_b(2);
    550   message.mutable_optional_message()->set_c(3);
    551   EXPECT_TRUE(message.IsInitialized());
    552 
    553   message.add_repeated_message();
    554   EXPECT_FALSE(message.IsInitialized());
    555 
    556   message.mutable_repeated_message(0)->set_a(1);
    557   message.mutable_repeated_message(0)->set_b(2);
    558   message.mutable_repeated_message(0)->set_c(3);
    559   EXPECT_TRUE(message.IsInitialized());
    560 }
    561 
    562 TEST(GeneratedMessageTest, ForeignNested) {
    563   // Test that TestAllTypes::NestedMessage can be embedded directly into
    564   // another message.
    565   unittest::TestForeignNested message;
    566 
    567   // If this compiles and runs without crashing, it must work.  We have
    568   // nothing more to test.
    569   unittest::TestAllTypes::NestedMessage* nested =
    570     message.mutable_foreign_nested();
    571   nested->set_bb(1);
    572 }
    573 
    574 TEST(GeneratedMessageTest, ReallyLargeTagNumber) {
    575   // Test that really large tag numbers don't break anything.
    576   unittest::TestReallyLargeTagNumber message1, message2;
    577   string data;
    578 
    579   // For the most part, if this compiles and runs then we're probably good.
    580   // (The most likely cause for failure would be if something were attempting
    581   // to allocate a lookup table of some sort using tag numbers as the index.)
    582   // We'll try serializing just for fun.
    583   message1.set_a(1234);
    584   message1.set_bb(5678);
    585   message1.SerializeToString(&data);
    586   EXPECT_TRUE(message2.ParseFromString(data));
    587   EXPECT_EQ(1234, message2.a());
    588   EXPECT_EQ(5678, message2.bb());
    589 }
    590 
    591 TEST(GeneratedMessageTest, MutualRecursion) {
    592   // Test that mutually-recursive message types work.
    593   unittest::TestMutualRecursionA message;
    594   unittest::TestMutualRecursionA* nested = message.mutable_bb()->mutable_a();
    595   unittest::TestMutualRecursionA* nested2 = nested->mutable_bb()->mutable_a();
    596 
    597   // Again, if the above compiles and runs, that's all we really have to
    598   // test, but just for run we'll check that the system didn't somehow come
    599   // up with a pointer loop...
    600   EXPECT_NE(&message, nested);
    601   EXPECT_NE(&message, nested2);
    602   EXPECT_NE(nested, nested2);
    603 }
    604 
    605 TEST(GeneratedMessageTest, CamelCaseFieldNames) {
    606   // This test is mainly checking that the following compiles, which verifies
    607   // that the field names were coerced to lower-case.
    608   //
    609   // Protocol buffers standard style is to use lowercase-with-underscores for
    610   // field names.  Some old proto1 .protos unfortunately used camel-case field
    611   // names.  In proto1, these names were forced to lower-case.  So, we do the
    612   // same thing in proto2.
    613 
    614   unittest::TestCamelCaseFieldNames message;
    615 
    616   message.set_primitivefield(2);
    617   message.set_stringfield("foo");
    618   message.set_enumfield(unittest::FOREIGN_FOO);
    619   message.mutable_messagefield()->set_c(6);
    620 
    621   message.add_repeatedprimitivefield(8);
    622   message.add_repeatedstringfield("qux");
    623   message.add_repeatedenumfield(unittest::FOREIGN_BAR);
    624   message.add_repeatedmessagefield()->set_c(15);
    625 
    626   EXPECT_EQ(2, message.primitivefield());
    627   EXPECT_EQ("foo", message.stringfield());
    628   EXPECT_EQ(unittest::FOREIGN_FOO, message.enumfield());
    629   EXPECT_EQ(6, message.messagefield().c());
    630 
    631   EXPECT_EQ(8, message.repeatedprimitivefield(0));
    632   EXPECT_EQ("qux", message.repeatedstringfield(0));
    633   EXPECT_EQ(unittest::FOREIGN_BAR, message.repeatedenumfield(0));
    634   EXPECT_EQ(15, message.repeatedmessagefield(0).c());
    635 }
    636 
    637 TEST(GeneratedMessageTest, TestConflictingSymbolNames) {
    638   // test_bad_identifiers.proto successfully compiled, then it works.  The
    639   // following is just a token usage to insure that the code is, in fact,
    640   // being compiled and linked.
    641 
    642   protobuf_unittest::TestConflictingSymbolNames message;
    643   message.set_uint32(1);
    644   EXPECT_EQ(3, message.ByteSize());
    645 
    646   message.set_friend_(5);
    647   EXPECT_EQ(5, message.friend_());
    648 }
    649 
    650 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    651 
    652 TEST(GeneratedMessageTest, TestOptimizedForSize) {
    653   // We rely on the tests in reflection_ops_unittest and wire_format_unittest
    654   // to really test that reflection-based methods work.  Here we are mostly
    655   // just making sure that TestOptimizedForSize actually builds and seems to
    656   // function.
    657 
    658   protobuf_unittest::TestOptimizedForSize message, message2;
    659   message.set_i(1);
    660   message.mutable_msg()->set_c(2);
    661   message2.CopyFrom(message);
    662   EXPECT_EQ(1, message2.i());
    663   EXPECT_EQ(2, message2.msg().c());
    664 }
    665 
    666 TEST(GeneratedMessageTest, TestEmbedOptimizedForSize) {
    667   // Verifies that something optimized for speed can contain something optimized
    668   // for size.
    669 
    670   protobuf_unittest::TestEmbedOptimizedForSize message, message2;
    671   message.mutable_optional_message()->set_i(1);
    672   message.add_repeated_message()->mutable_msg()->set_c(2);
    673   string data;
    674   message.SerializeToString(&data);
    675   ASSERT_TRUE(message2.ParseFromString(data));
    676   EXPECT_EQ(1, message2.optional_message().i());
    677   EXPECT_EQ(2, message2.repeated_message(0).msg().c());
    678 }
    679 
    680 TEST(GeneratedMessageTest, TestSpaceUsed) {
    681   unittest::TestAllTypes message1;
    682   // sizeof provides a lower bound on SpaceUsed().
    683   EXPECT_LE(sizeof(unittest::TestAllTypes), message1.SpaceUsed());
    684   const int empty_message_size = message1.SpaceUsed();
    685 
    686   // Setting primitive types shouldn't affect the space used.
    687   message1.set_optional_int32(123);
    688   message1.set_optional_int64(12345);
    689   message1.set_optional_uint32(123);
    690   message1.set_optional_uint64(12345);
    691   EXPECT_EQ(empty_message_size, message1.SpaceUsed());
    692 
    693   // On some STL implementations, setting the string to a small value should
    694   // only increase SpaceUsed() by the size of a string object, though this is
    695   // not true everywhere.
    696   message1.set_optional_string("abc");
    697   EXPECT_LE(empty_message_size + sizeof(string), message1.SpaceUsed());
    698 
    699   // Setting a string to a value larger than the string object itself should
    700   // increase SpaceUsed(), because it cannot store the value internally.
    701   message1.set_optional_string(string(sizeof(string) + 1, 'x'));
    702   int min_expected_increase = message1.optional_string().capacity() +
    703       sizeof(string);
    704   EXPECT_LE(empty_message_size + min_expected_increase,
    705             message1.SpaceUsed());
    706 
    707   int previous_size = message1.SpaceUsed();
    708   // Adding an optional message should increase the size by the size of the
    709   // nested message type. NestedMessage is simple enough (1 int field) that it
    710   // is equal to sizeof(NestedMessage)
    711   message1.mutable_optional_nested_message();
    712   ASSERT_EQ(sizeof(unittest::TestAllTypes::NestedMessage),
    713             message1.optional_nested_message().SpaceUsed());
    714   EXPECT_EQ(previous_size +
    715             sizeof(unittest::TestAllTypes::NestedMessage),
    716             message1.SpaceUsed());
    717 }
    718 
    719 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
    720 
    721 TEST(GeneratedMessageTest, FieldConstantValues) {
    722   unittest::TestRequired message;
    723   EXPECT_EQ(unittest::TestAllTypes_NestedMessage::kBbFieldNumber, 1);
    724   EXPECT_EQ(unittest::TestAllTypes::kOptionalInt32FieldNumber, 1);
    725   EXPECT_EQ(unittest::TestAllTypes::kOptionalgroupFieldNumber, 16);
    726   EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedMessageFieldNumber, 18);
    727   EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedEnumFieldNumber, 21);
    728   EXPECT_EQ(unittest::TestAllTypes::kRepeatedInt32FieldNumber, 31);
    729   EXPECT_EQ(unittest::TestAllTypes::kRepeatedgroupFieldNumber, 46);
    730   EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedMessageFieldNumber, 48);
    731   EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedEnumFieldNumber, 51);
    732 }
    733 
    734 TEST(GeneratedMessageTest, ExtensionConstantValues) {
    735   EXPECT_EQ(unittest::TestRequired::kSingleFieldNumber, 1000);
    736   EXPECT_EQ(unittest::TestRequired::kMultiFieldNumber, 1001);
    737   EXPECT_EQ(unittest::kOptionalInt32ExtensionFieldNumber, 1);
    738   EXPECT_EQ(unittest::kOptionalgroupExtensionFieldNumber, 16);
    739   EXPECT_EQ(unittest::kOptionalNestedMessageExtensionFieldNumber, 18);
    740   EXPECT_EQ(unittest::kOptionalNestedEnumExtensionFieldNumber, 21);
    741   EXPECT_EQ(unittest::kRepeatedInt32ExtensionFieldNumber, 31);
    742   EXPECT_EQ(unittest::kRepeatedgroupExtensionFieldNumber, 46);
    743   EXPECT_EQ(unittest::kRepeatedNestedMessageExtensionFieldNumber, 48);
    744   EXPECT_EQ(unittest::kRepeatedNestedEnumExtensionFieldNumber, 51);
    745 }
    746 
    747 // ===================================================================
    748 
    749 TEST(GeneratedEnumTest, EnumValuesAsSwitchCases) {
    750   // Test that our nested enum values can be used as switch cases.  This test
    751   // doesn't actually do anything, the proof that it works is that it
    752   // compiles.
    753   int i =0;
    754   unittest::TestAllTypes::NestedEnum a = unittest::TestAllTypes::BAR;
    755   switch (a) {
    756     case unittest::TestAllTypes::FOO:
    757       i = 1;
    758       break;
    759     case unittest::TestAllTypes::BAR:
    760       i = 2;
    761       break;
    762     case unittest::TestAllTypes::BAZ:
    763       i = 3;
    764       break;
    765     // no default case:  We want to make sure the compiler recognizes that
    766     //   all cases are covered.  (GCC warns if you do not cover all cases of
    767     //   an enum in a switch.)
    768   }
    769 
    770   // Token check just for fun.
    771   EXPECT_EQ(2, i);
    772 }
    773 
    774 TEST(GeneratedEnumTest, IsValidValue) {
    775   // Test enum IsValidValue.
    776   EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(1));
    777   EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(2));
    778   EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(3));
    779 
    780   EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(0));
    781   EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(4));
    782 
    783   // Make sure it also works when there are dups.
    784   EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(1));
    785   EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(2));
    786   EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(3));
    787 
    788   EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(0));
    789   EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(4));
    790 }
    791 
    792 TEST(GeneratedEnumTest, MinAndMax) {
    793   EXPECT_EQ(unittest::TestAllTypes::FOO,
    794             unittest::TestAllTypes::NestedEnum_MIN);
    795   EXPECT_EQ(unittest::TestAllTypes::BAZ,
    796             unittest::TestAllTypes::NestedEnum_MAX);
    797   EXPECT_EQ(4, unittest::TestAllTypes::NestedEnum_ARRAYSIZE);
    798 
    799   EXPECT_EQ(unittest::FOREIGN_FOO, unittest::ForeignEnum_MIN);
    800   EXPECT_EQ(unittest::FOREIGN_BAZ, unittest::ForeignEnum_MAX);
    801   EXPECT_EQ(7, unittest::ForeignEnum_ARRAYSIZE);
    802 
    803   EXPECT_EQ(1, unittest::TestEnumWithDupValue_MIN);
    804   EXPECT_EQ(3, unittest::TestEnumWithDupValue_MAX);
    805   EXPECT_EQ(4, unittest::TestEnumWithDupValue_ARRAYSIZE);
    806 
    807   EXPECT_EQ(unittest::SPARSE_E, unittest::TestSparseEnum_MIN);
    808   EXPECT_EQ(unittest::SPARSE_C, unittest::TestSparseEnum_MAX);
    809   EXPECT_EQ(12589235, unittest::TestSparseEnum_ARRAYSIZE);
    810 
    811   // Make sure we can take the address of _MIN, _MAX and _ARRAYSIZE.
    812   void* nullptr = 0;  // NULL may be integer-type, not pointer-type.
    813   EXPECT_NE(nullptr, &unittest::TestAllTypes::NestedEnum_MIN);
    814   EXPECT_NE(nullptr, &unittest::TestAllTypes::NestedEnum_MAX);
    815   EXPECT_NE(nullptr, &unittest::TestAllTypes::NestedEnum_ARRAYSIZE);
    816 
    817   EXPECT_NE(nullptr, &unittest::ForeignEnum_MIN);
    818   EXPECT_NE(nullptr, &unittest::ForeignEnum_MAX);
    819   EXPECT_NE(nullptr, &unittest::ForeignEnum_ARRAYSIZE);
    820 
    821   // Make sure we can use _MIN, _MAX and _ARRAYSIZE as switch cases.
    822   switch (unittest::SPARSE_A) {
    823     case unittest::TestSparseEnum_MIN:
    824     case unittest::TestSparseEnum_MAX:
    825     case unittest::TestSparseEnum_ARRAYSIZE:
    826       break;
    827     default:
    828       break;
    829   }
    830 }
    831 
    832 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    833 
    834 TEST(GeneratedEnumTest, Name) {
    835   // "Names" in the presence of dup values are a bit arbitrary.
    836   EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO1));
    837   EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO2));
    838 
    839   EXPECT_EQ("SPARSE_A", unittest::TestSparseEnum_Name(unittest::SPARSE_A));
    840   EXPECT_EQ("SPARSE_B", unittest::TestSparseEnum_Name(unittest::SPARSE_B));
    841   EXPECT_EQ("SPARSE_C", unittest::TestSparseEnum_Name(unittest::SPARSE_C));
    842   EXPECT_EQ("SPARSE_D", unittest::TestSparseEnum_Name(unittest::SPARSE_D));
    843   EXPECT_EQ("SPARSE_E", unittest::TestSparseEnum_Name(unittest::SPARSE_E));
    844   EXPECT_EQ("SPARSE_F", unittest::TestSparseEnum_Name(unittest::SPARSE_F));
    845   EXPECT_EQ("SPARSE_G", unittest::TestSparseEnum_Name(unittest::SPARSE_G));
    846 }
    847 
    848 TEST(GeneratedEnumTest, Parse) {
    849   unittest::TestEnumWithDupValue dup_value = unittest::FOO1;
    850   EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO1", &dup_value));
    851   EXPECT_EQ(unittest::FOO1, dup_value);
    852   EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO2", &dup_value));
    853   EXPECT_EQ(unittest::FOO2, dup_value);
    854   EXPECT_FALSE(unittest::TestEnumWithDupValue_Parse("FOO", &dup_value));
    855 }
    856 
    857 TEST(GeneratedEnumTest, GetEnumDescriptor) {
    858   EXPECT_EQ(unittest::TestAllTypes::NestedEnum_descriptor(),
    859             GetEnumDescriptor<unittest::TestAllTypes::NestedEnum>());
    860   EXPECT_EQ(unittest::ForeignEnum_descriptor(),
    861             GetEnumDescriptor<unittest::ForeignEnum>());
    862   EXPECT_EQ(unittest::TestEnumWithDupValue_descriptor(),
    863             GetEnumDescriptor<unittest::TestEnumWithDupValue>());
    864   EXPECT_EQ(unittest::TestSparseEnum_descriptor(),
    865             GetEnumDescriptor<unittest::TestSparseEnum>());
    866 }
    867 
    868 #endif  // PROTOBUF_TEST_NO_DESCRIPTORS
    869 
    870 // ===================================================================
    871 
    872 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS
    873 
    874 // Support code for testing services.
    875 class GeneratedServiceTest : public testing::Test {
    876  protected:
    877   class MockTestService : public unittest::TestService {
    878    public:
    879     MockTestService()
    880       : called_(false),
    881         method_(""),
    882         controller_(NULL),
    883         request_(NULL),
    884         response_(NULL),
    885         done_(NULL) {}
    886 
    887     ~MockTestService() {}
    888 
    889     void Reset() { called_ = false; }
    890 
    891     // implements TestService ----------------------------------------
    892 
    893     void Foo(RpcController* controller,
    894              const unittest::FooRequest* request,
    895              unittest::FooResponse* response,
    896              Closure* done) {
    897       ASSERT_FALSE(called_);
    898       called_ = true;
    899       method_ = "Foo";
    900       controller_ = controller;
    901       request_ = request;
    902       response_ = response;
    903       done_ = done;
    904     }
    905 
    906     void Bar(RpcController* controller,
    907              const unittest::BarRequest* request,
    908              unittest::BarResponse* response,
    909              Closure* done) {
    910       ASSERT_FALSE(called_);
    911       called_ = true;
    912       method_ = "Bar";
    913       controller_ = controller;
    914       request_ = request;
    915       response_ = response;
    916       done_ = done;
    917     }
    918 
    919     // ---------------------------------------------------------------
    920 
    921     bool called_;
    922     string method_;
    923     RpcController* controller_;
    924     const Message* request_;
    925     Message* response_;
    926     Closure* done_;
    927   };
    928 
    929   class MockRpcChannel : public RpcChannel {
    930    public:
    931     MockRpcChannel()
    932       : called_(false),
    933         method_(NULL),
    934         controller_(NULL),
    935         request_(NULL),
    936         response_(NULL),
    937         done_(NULL),
    938         destroyed_(NULL) {}
    939 
    940     ~MockRpcChannel() {
    941       if (destroyed_ != NULL) *destroyed_ = true;
    942     }
    943 
    944     void Reset() { called_ = false; }
    945 
    946     // implements TestService ----------------------------------------
    947 
    948     void CallMethod(const MethodDescriptor* method,
    949                     RpcController* controller,
    950                     const Message* request,
    951                     Message* response,
    952                     Closure* done) {
    953       ASSERT_FALSE(called_);
    954       called_ = true;
    955       method_ = method;
    956       controller_ = controller;
    957       request_ = request;
    958       response_ = response;
    959       done_ = done;
    960     }
    961 
    962     // ---------------------------------------------------------------
    963 
    964     bool called_;
    965     const MethodDescriptor* method_;
    966     RpcController* controller_;
    967     const Message* request_;
    968     Message* response_;
    969     Closure* done_;
    970     bool* destroyed_;
    971   };
    972 
    973   class MockController : public RpcController {
    974    public:
    975     void Reset() {
    976       ADD_FAILURE() << "Reset() not expected during this test.";
    977     }
    978     bool Failed() const {
    979       ADD_FAILURE() << "Failed() not expected during this test.";
    980       return false;
    981     }
    982     string ErrorText() const {
    983       ADD_FAILURE() << "ErrorText() not expected during this test.";
    984       return "";
    985     }
    986     void StartCancel() {
    987       ADD_FAILURE() << "StartCancel() not expected during this test.";
    988     }
    989     void SetFailed(const string& reason) {
    990       ADD_FAILURE() << "SetFailed() not expected during this test.";
    991     }
    992     bool IsCanceled() const {
    993       ADD_FAILURE() << "IsCanceled() not expected during this test.";
    994       return false;
    995     }
    996     void NotifyOnCancel(Closure* callback) {
    997       ADD_FAILURE() << "NotifyOnCancel() not expected during this test.";
    998     }
    999   };
   1000 
   1001   GeneratedServiceTest()
   1002     : descriptor_(unittest::TestService::descriptor()),
   1003       foo_(descriptor_->FindMethodByName("Foo")),
   1004       bar_(descriptor_->FindMethodByName("Bar")),
   1005       stub_(&mock_channel_),
   1006       done_(NewPermanentCallback(&DoNothing)) {}
   1007 
   1008   virtual void SetUp() {
   1009     ASSERT_TRUE(foo_ != NULL);
   1010     ASSERT_TRUE(bar_ != NULL);
   1011   }
   1012 
   1013   const ServiceDescriptor* descriptor_;
   1014   const MethodDescriptor* foo_;
   1015   const MethodDescriptor* bar_;
   1016 
   1017   MockTestService mock_service_;
   1018   MockController mock_controller_;
   1019 
   1020   MockRpcChannel mock_channel_;
   1021   unittest::TestService::Stub stub_;
   1022 
   1023   // Just so we don't have to re-define these with every test.
   1024   unittest::FooRequest foo_request_;
   1025   unittest::FooResponse foo_response_;
   1026   unittest::BarRequest bar_request_;
   1027   unittest::BarResponse bar_response_;
   1028   scoped_ptr<Closure> done_;
   1029 };
   1030 
   1031 TEST_F(GeneratedServiceTest, GetDescriptor) {
   1032   // Test that GetDescriptor() works.
   1033 
   1034   EXPECT_EQ(descriptor_, mock_service_.GetDescriptor());
   1035 }
   1036 
   1037 TEST_F(GeneratedServiceTest, GetChannel) {
   1038   EXPECT_EQ(&mock_channel_, stub_.channel());
   1039 }
   1040 
   1041 TEST_F(GeneratedServiceTest, OwnsChannel) {
   1042   MockRpcChannel* channel = new MockRpcChannel;
   1043   bool destroyed = false;
   1044   channel->destroyed_ = &destroyed;
   1045 
   1046   {
   1047     unittest::TestService::Stub owning_stub(channel,
   1048                                             Service::STUB_OWNS_CHANNEL);
   1049     EXPECT_FALSE(destroyed);
   1050   }
   1051 
   1052   EXPECT_TRUE(destroyed);
   1053 }
   1054 
   1055 TEST_F(GeneratedServiceTest, CallMethod) {
   1056   // Test that CallMethod() works.
   1057 
   1058   // Call Foo() via CallMethod().
   1059   mock_service_.CallMethod(foo_, &mock_controller_,
   1060                            &foo_request_, &foo_response_, done_.get());
   1061 
   1062   ASSERT_TRUE(mock_service_.called_);
   1063 
   1064   EXPECT_EQ("Foo"            , mock_service_.method_    );
   1065   EXPECT_EQ(&mock_controller_, mock_service_.controller_);
   1066   EXPECT_EQ(&foo_request_    , mock_service_.request_   );
   1067   EXPECT_EQ(&foo_response_   , mock_service_.response_  );
   1068   EXPECT_EQ(done_.get()      , mock_service_.done_      );
   1069 
   1070   // Try again, but call Bar() instead.
   1071   mock_service_.Reset();
   1072   mock_service_.CallMethod(bar_, &mock_controller_,
   1073                            &bar_request_, &bar_response_, done_.get());
   1074 
   1075   ASSERT_TRUE(mock_service_.called_);
   1076   EXPECT_EQ("Bar", mock_service_.method_);
   1077 }
   1078 
   1079 TEST_F(GeneratedServiceTest, CallMethodTypeFailure) {
   1080   // Verify death if we call Foo() with Bar's message types.
   1081 
   1082 #ifdef GTEST_HAS_DEATH_TEST  // death tests do not work on Windows yet
   1083   EXPECT_DEBUG_DEATH(
   1084     mock_service_.CallMethod(foo_, &mock_controller_,
   1085                              &foo_request_, &bar_response_, done_.get()),
   1086     "dynamic_cast");
   1087 
   1088   mock_service_.Reset();
   1089   EXPECT_DEBUG_DEATH(
   1090     mock_service_.CallMethod(foo_, &mock_controller_,
   1091                              &bar_request_, &foo_response_, done_.get()),
   1092     "dynamic_cast");
   1093 #endif  // GTEST_HAS_DEATH_TEST
   1094 }
   1095 
   1096 TEST_F(GeneratedServiceTest, GetPrototypes) {
   1097   // Test Get{Request,Response}Prototype() methods.
   1098 
   1099   EXPECT_EQ(&unittest::FooRequest::default_instance(),
   1100             &mock_service_.GetRequestPrototype(foo_));
   1101   EXPECT_EQ(&unittest::BarRequest::default_instance(),
   1102             &mock_service_.GetRequestPrototype(bar_));
   1103 
   1104   EXPECT_EQ(&unittest::FooResponse::default_instance(),
   1105             &mock_service_.GetResponsePrototype(foo_));
   1106   EXPECT_EQ(&unittest::BarResponse::default_instance(),
   1107             &mock_service_.GetResponsePrototype(bar_));
   1108 }
   1109 
   1110 TEST_F(GeneratedServiceTest, Stub) {
   1111   // Test that the stub class works.
   1112 
   1113   // Call Foo() via the stub.
   1114   stub_.Foo(&mock_controller_, &foo_request_, &foo_response_, done_.get());
   1115 
   1116   ASSERT_TRUE(mock_channel_.called_);
   1117 
   1118   EXPECT_EQ(foo_             , mock_channel_.method_    );
   1119   EXPECT_EQ(&mock_controller_, mock_channel_.controller_);
   1120   EXPECT_EQ(&foo_request_    , mock_channel_.request_   );
   1121   EXPECT_EQ(&foo_response_   , mock_channel_.response_  );
   1122   EXPECT_EQ(done_.get()      , mock_channel_.done_      );
   1123 
   1124   // Call Bar() via the stub.
   1125   mock_channel_.Reset();
   1126   stub_.Bar(&mock_controller_, &bar_request_, &bar_response_, done_.get());
   1127 
   1128   ASSERT_TRUE(mock_channel_.called_);
   1129   EXPECT_EQ(bar_, mock_channel_.method_);
   1130 }
   1131 
   1132 TEST_F(GeneratedServiceTest, NotImplemented) {
   1133   // Test that failing to implement a method of a service causes it to fail
   1134   // with a "not implemented" error message.
   1135 
   1136   // A service which doesn't implement any methods.
   1137   class UnimplementedService : public unittest::TestService {
   1138    public:
   1139     UnimplementedService() {}
   1140   };
   1141 
   1142   UnimplementedService unimplemented_service;
   1143 
   1144   // And a controller which expects to get a "not implemented" error.
   1145   class ExpectUnimplementedController : public MockController {
   1146    public:
   1147     ExpectUnimplementedController() : called_(false) {}
   1148 
   1149     void SetFailed(const string& reason) {
   1150       EXPECT_FALSE(called_);
   1151       called_ = true;
   1152       EXPECT_EQ("Method Foo() not implemented.", reason);
   1153     }
   1154 
   1155     bool called_;
   1156   };
   1157 
   1158   ExpectUnimplementedController controller;
   1159 
   1160   // Call Foo.
   1161   unimplemented_service.Foo(&controller, &foo_request_, &foo_response_,
   1162                             done_.get());
   1163 
   1164   EXPECT_TRUE(controller.called_);
   1165 }
   1166 
   1167 }  // namespace cpp_unittest
   1168 }  // namespace cpp
   1169 }  // namespace compiler
   1170 
   1171 namespace no_generic_services_test {
   1172   // Verify that no class called "TestService" was defined in
   1173   // unittest_no_generic_services.pb.h by defining a different type by the same
   1174   // name.  If such a service was generated, this will not compile.
   1175   struct TestService {
   1176     int i;
   1177   };
   1178 }
   1179 
   1180 namespace compiler {
   1181 namespace cpp {
   1182 namespace cpp_unittest {
   1183 
   1184 TEST_F(GeneratedServiceTest, NoGenericServices) {
   1185   // Verify that non-services in unittest_no_generic_services.proto were
   1186   // generated.
   1187   no_generic_services_test::TestMessage message;
   1188   message.set_a(1);
   1189   message.SetExtension(no_generic_services_test::test_extension, 123);
   1190   no_generic_services_test::TestEnum e = no_generic_services_test::FOO;
   1191   EXPECT_EQ(e, 1);
   1192 
   1193   // Verify that a ServiceDescriptor is generated for the service even if the
   1194   // class itself is not.
   1195   const FileDescriptor* file =
   1196       no_generic_services_test::TestMessage::descriptor()->file();
   1197 
   1198   ASSERT_EQ(1, file->service_count());
   1199   EXPECT_EQ("TestService", file->service(0)->name());
   1200   ASSERT_EQ(1, file->service(0)->method_count());
   1201   EXPECT_EQ("Foo", file->service(0)->method(0)->name());
   1202 }
   1203 
   1204 #endif  // !PROTOBUF_TEST_NO_DESCRIPTORS
   1205 
   1206 // ===================================================================
   1207 
   1208 // This test must run last.  It verifies that descriptors were or were not
   1209 // initialized depending on whether PROTOBUF_TEST_NO_DESCRIPTORS was defined.
   1210 // When this is defined, we skip all tests which are expected to trigger
   1211 // descriptor initialization.  This verifies that everything else still works
   1212 // if descriptors are not initialized.
   1213 TEST(DescriptorInitializationTest, Initialized) {
   1214 #ifdef PROTOBUF_TEST_NO_DESCRIPTORS
   1215   bool should_have_descriptors = false;
   1216 #else
   1217   bool should_have_descriptors = true;
   1218 #endif
   1219 
   1220   EXPECT_EQ(should_have_descriptors,
   1221     DescriptorPool::generated_pool()->InternalIsFileLoaded(
   1222       "google/protobuf/unittest.proto"));
   1223 }
   1224 
   1225 }  // namespace cpp_unittest
   1226 
   1227 }  // namespace cpp
   1228 }  // namespace compiler
   1229 }  // namespace protobuf
   1230 }  // namespace google
   1231