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