1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 // Author: kenton (at) google.com (Kenton Varda) 32 // Based on original Protocol Buffers design by 33 // Sanjay Ghemawat, Jeff Dean, and others. 34 // 35 // To test 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 <memory> 50 #ifndef _SHARED_PTR_H 51 #include <google/protobuf/stubs/shared_ptr.h> 52 #endif 53 #include <vector> 54 55 #include <google/protobuf/unittest.pb.h> 56 #include <google/protobuf/unittest_optimize_for.pb.h> 57 #include <google/protobuf/unittest_embed_optimize_for.pb.h> 58 #if !defined(GOOGLE_PROTOBUF_CMAKE_BUILD) && !defined(_MSC_VER) 59 // We exclude this large proto from cmake build because it's too large for 60 // visual studio to compile (report internal errors). 61 #include <google/protobuf/unittest_enormous_descriptor.pb.h> 62 #endif 63 #include <google/protobuf/unittest_no_generic_services.pb.h> 64 #include <google/protobuf/test_util.h> 65 #include <google/protobuf/compiler/cpp/cpp_helpers.h> 66 #include <google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h> 67 #include <google/protobuf/compiler/importer.h> 68 #include <google/protobuf/io/coded_stream.h> 69 #include <google/protobuf/io/zero_copy_stream_impl.h> 70 #include <google/protobuf/descriptor.h> 71 #include <google/protobuf/descriptor.pb.h> 72 #include <google/protobuf/dynamic_message.h> 73 74 #include <google/protobuf/stubs/callback.h> 75 #include <google/protobuf/stubs/common.h> 76 #include <google/protobuf/stubs/logging.h> 77 #include <google/protobuf/stubs/strutil.h> 78 #include <google/protobuf/stubs/substitute.h> 79 #include <google/protobuf/testing/googletest.h> 80 #include <gtest/gtest.h> 81 #include <google/protobuf/stubs/stl_util.h> 82 83 namespace google { 84 namespace protobuf { 85 namespace compiler { 86 namespace cpp { 87 88 // Can't use an anonymous namespace here due to brokenness of Tru64 compiler. 89 namespace cpp_unittest { 90 91 namespace protobuf_unittest = ::protobuf_unittest; 92 93 94 class MockErrorCollector : public MultiFileErrorCollector { 95 public: 96 MockErrorCollector() {} 97 ~MockErrorCollector() {} 98 99 string text_; 100 101 // implements ErrorCollector --------------------------------------- 102 void AddError(const string& filename, int line, int column, 103 const string& message) { 104 strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", 105 filename, line, column, message); 106 } 107 }; 108 109 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS 110 111 // Test that generated code has proper descriptors: 112 // Parse a descriptor directly (using google::protobuf::compiler::Importer) and 113 // compare it to the one that was produced by generated code. 114 TEST(GeneratedDescriptorTest, IdenticalDescriptors) { 115 const FileDescriptor* generated_descriptor = 116 unittest::TestAllTypes::descriptor()->file(); 117 118 // Set up the Importer. 119 MockErrorCollector error_collector; 120 DiskSourceTree source_tree; 121 source_tree.MapPath("", TestSourceDir()); 122 Importer importer(&source_tree, &error_collector); 123 124 // Import (parse) unittest.proto. 125 const FileDescriptor* parsed_descriptor = 126 importer.Import("google/protobuf/unittest.proto"); 127 EXPECT_EQ("", error_collector.text_); 128 ASSERT_TRUE(parsed_descriptor != NULL); 129 130 // Test that descriptors are generated correctly by converting them to 131 // FileDescriptorProtos and comparing. 132 FileDescriptorProto generated_decsriptor_proto, parsed_descriptor_proto; 133 generated_descriptor->CopyTo(&generated_decsriptor_proto); 134 parsed_descriptor->CopyTo(&parsed_descriptor_proto); 135 136 EXPECT_EQ(parsed_descriptor_proto.DebugString(), 137 generated_decsriptor_proto.DebugString()); 138 } 139 140 #if !defined(GOOGLE_PROTOBUF_CMAKE_BUILD) && !defined(_MSC_VER) 141 // Test that generated code has proper descriptors: 142 // Touch a descriptor generated from an enormous message to validate special 143 // handling for descriptors exceeding the C++ standard's recommended minimum 144 // limit for string literal size 145 TEST(GeneratedDescriptorTest, EnormousDescriptor) { 146 const Descriptor* generated_descriptor = 147 TestEnormousDescriptor::descriptor(); 148 149 EXPECT_TRUE(generated_descriptor != NULL); 150 } 151 #endif 152 153 #endif // !PROTOBUF_TEST_NO_DESCRIPTORS 154 155 // =================================================================== 156 157 TEST(GeneratedMessageTest, Defaults) { 158 // Check that all default values are set correctly in the initial message. 159 unittest::TestAllTypes message; 160 161 TestUtil::ExpectClear(message); 162 163 // Messages should return pointers to default instances until first use. 164 // (This is not checked by ExpectClear() since it is not actually true after 165 // the fields have been set and then cleared.) 166 EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(), 167 &message.optionalgroup()); 168 EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), 169 &message.optional_nested_message()); 170 EXPECT_EQ(&unittest::ForeignMessage::default_instance(), 171 &message.optional_foreign_message()); 172 EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), 173 &message.optional_import_message()); 174 } 175 176 #ifndef PROTOBUF_USE_DLLS 177 TEST(GeneratedMessageTest, Int32StringConversion) { 178 EXPECT_EQ("971", Int32ToString(971)); 179 EXPECT_EQ("(~0x7fffffff)", Int32ToString(kint32min)); 180 EXPECT_EQ("2147483647", Int32ToString(kint32max)); 181 } 182 183 TEST(GeneratedMessageTest, Int64StringConversion) { 184 EXPECT_EQ("GOOGLE_LONGLONG(971)", Int64ToString(971)); 185 EXPECT_EQ("GOOGLE_LONGLONG(-2147483648)", Int64ToString(kint32min)); 186 EXPECT_EQ("GOOGLE_LONGLONG(~0x7fffffffffffffff)", Int64ToString(kint64min)); 187 EXPECT_EQ("GOOGLE_LONGLONG(9223372036854775807)", Int64ToString(kint64max)); 188 } 189 #endif // !PROTOBUF_USE_DLLS 190 191 TEST(GeneratedMessageTest, FloatingPointDefaults) { 192 const unittest::TestExtremeDefaultValues& extreme_default = 193 unittest::TestExtremeDefaultValues::default_instance(); 194 195 EXPECT_EQ(0.0f, extreme_default.zero_float()); 196 EXPECT_EQ(1.0f, extreme_default.one_float()); 197 EXPECT_EQ(1.5f, extreme_default.small_float()); 198 EXPECT_EQ(-1.0f, extreme_default.negative_one_float()); 199 EXPECT_EQ(-1.5f, extreme_default.negative_float()); 200 EXPECT_EQ(2.0e8f, extreme_default.large_float()); 201 EXPECT_EQ(-8e-28f, extreme_default.small_negative_float()); 202 EXPECT_EQ(numeric_limits<double>::infinity(), 203 extreme_default.inf_double()); 204 EXPECT_EQ(-numeric_limits<double>::infinity(), 205 extreme_default.neg_inf_double()); 206 EXPECT_TRUE(extreme_default.nan_double() != extreme_default.nan_double()); 207 EXPECT_EQ(numeric_limits<float>::infinity(), 208 extreme_default.inf_float()); 209 EXPECT_EQ(-numeric_limits<float>::infinity(), 210 extreme_default.neg_inf_float()); 211 EXPECT_TRUE(extreme_default.nan_float() != extreme_default.nan_float()); 212 } 213 214 TEST(GeneratedMessageTest, Trigraph) { 215 const unittest::TestExtremeDefaultValues& extreme_default = 216 unittest::TestExtremeDefaultValues::default_instance(); 217 218 EXPECT_EQ("? ? ?? ?? ??? ?\?/ ?\?-", extreme_default.cpp_trigraph()); 219 } 220 221 TEST(GeneratedMessageTest, ExtremeSmallIntegerDefault) { 222 const unittest::TestExtremeDefaultValues& extreme_default = 223 unittest::TestExtremeDefaultValues::default_instance(); 224 EXPECT_EQ(~0x7fffffff, kint32min); 225 EXPECT_EQ(GOOGLE_LONGLONG(~0x7fffffffffffffff), kint64min); 226 EXPECT_EQ(kint32min, extreme_default.really_small_int32()); 227 EXPECT_EQ(kint64min, extreme_default.really_small_int64()); 228 } 229 230 TEST(GeneratedMessageTest, Accessors) { 231 // Set every field to a unique value then go back and check all those 232 // values. 233 unittest::TestAllTypes message; 234 235 TestUtil::SetAllFields(&message); 236 TestUtil::ExpectAllFieldsSet(message); 237 238 TestUtil::ModifyRepeatedFields(&message); 239 TestUtil::ExpectRepeatedFieldsModified(message); 240 } 241 242 TEST(GeneratedMessageTest, MutableStringDefault) { 243 // mutable_foo() for a string should return a string initialized to its 244 // default value. 245 unittest::TestAllTypes message; 246 247 EXPECT_EQ("hello", *message.mutable_default_string()); 248 249 // Note that the first time we call mutable_foo(), we get a newly-allocated 250 // string, but if we clear it and call it again, we get the same object again. 251 // We should verify that it has its default value in both cases. 252 message.set_default_string("blah"); 253 message.Clear(); 254 255 EXPECT_EQ("hello", *message.mutable_default_string()); 256 } 257 258 TEST(GeneratedMessageTest, StringDefaults) { 259 unittest::TestExtremeDefaultValues message; 260 // Check if '\000' can be used in default string value. 261 EXPECT_EQ(string("hel\000lo", 6), message.string_with_zero()); 262 EXPECT_EQ(string("wor\000ld", 6), message.bytes_with_zero()); 263 } 264 265 TEST(GeneratedMessageTest, ReleaseString) { 266 // Check that release_foo() starts out NULL, and gives us a value 267 // that we can delete after it's been set. 268 unittest::TestAllTypes message; 269 270 EXPECT_EQ(NULL, message.release_default_string()); 271 EXPECT_FALSE(message.has_default_string()); 272 EXPECT_EQ("hello", message.default_string()); 273 274 message.set_default_string("blah"); 275 EXPECT_TRUE(message.has_default_string()); 276 google::protobuf::scoped_ptr<string> str(message.release_default_string()); 277 EXPECT_FALSE(message.has_default_string()); 278 ASSERT_TRUE(str != NULL); 279 EXPECT_EQ("blah", *str); 280 281 EXPECT_EQ(NULL, message.release_default_string()); 282 EXPECT_FALSE(message.has_default_string()); 283 EXPECT_EQ("hello", message.default_string()); 284 } 285 286 TEST(GeneratedMessageTest, ReleaseMessage) { 287 // Check that release_foo() starts out NULL, and gives us a value 288 // that we can delete after it's been set. 289 unittest::TestAllTypes message; 290 291 EXPECT_EQ(NULL, message.release_optional_nested_message()); 292 EXPECT_FALSE(message.has_optional_nested_message()); 293 294 message.mutable_optional_nested_message()->set_bb(1); 295 google::protobuf::scoped_ptr<unittest::TestAllTypes::NestedMessage> nest( 296 message.release_optional_nested_message()); 297 EXPECT_FALSE(message.has_optional_nested_message()); 298 ASSERT_TRUE(nest != NULL); 299 EXPECT_EQ(1, nest->bb()); 300 301 EXPECT_EQ(NULL, message.release_optional_nested_message()); 302 EXPECT_FALSE(message.has_optional_nested_message()); 303 } 304 305 TEST(GeneratedMessageTest, SetAllocatedString) { 306 // Check that set_allocated_foo() works for strings. 307 unittest::TestAllTypes message; 308 309 EXPECT_FALSE(message.has_optional_string()); 310 const string kHello("hello"); 311 message.set_optional_string(kHello); 312 EXPECT_TRUE(message.has_optional_string()); 313 314 message.set_allocated_optional_string(NULL); 315 EXPECT_FALSE(message.has_optional_string()); 316 EXPECT_EQ("", message.optional_string()); 317 318 message.set_allocated_optional_string(new string(kHello)); 319 EXPECT_TRUE(message.has_optional_string()); 320 EXPECT_EQ(kHello, message.optional_string()); 321 } 322 323 TEST(GeneratedMessageTest, SetAllocatedMessage) { 324 // Check that set_allocated_foo() can be called in all cases. 325 unittest::TestAllTypes message; 326 327 EXPECT_FALSE(message.has_optional_nested_message()); 328 329 message.mutable_optional_nested_message()->set_bb(1); 330 EXPECT_TRUE(message.has_optional_nested_message()); 331 332 message.set_allocated_optional_nested_message(NULL); 333 EXPECT_FALSE(message.has_optional_nested_message()); 334 EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), 335 &message.optional_nested_message()); 336 337 message.mutable_optional_nested_message()->set_bb(1); 338 unittest::TestAllTypes::NestedMessage* nest = 339 message.release_optional_nested_message(); 340 ASSERT_TRUE(nest != NULL); 341 EXPECT_FALSE(message.has_optional_nested_message()); 342 343 message.set_allocated_optional_nested_message(nest); 344 EXPECT_TRUE(message.has_optional_nested_message()); 345 EXPECT_EQ(1, message.optional_nested_message().bb()); 346 } 347 348 TEST(GeneratedMessageTest, Clear) { 349 // Set every field to a unique value, clear the message, then check that 350 // it is cleared. 351 unittest::TestAllTypes message; 352 353 TestUtil::SetAllFields(&message); 354 message.Clear(); 355 TestUtil::ExpectClear(message); 356 357 // Unlike with the defaults test, we do NOT expect that requesting embedded 358 // messages will return a pointer to the default instance. Instead, they 359 // should return the objects that were created when mutable_blah() was 360 // called. 361 EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), 362 &message.optionalgroup()); 363 EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), 364 &message.optional_nested_message()); 365 EXPECT_NE(&unittest::ForeignMessage::default_instance(), 366 &message.optional_foreign_message()); 367 EXPECT_NE(&unittest_import::ImportMessage::default_instance(), 368 &message.optional_import_message()); 369 } 370 371 TEST(GeneratedMessageTest, EmbeddedNullsInBytesCharStar) { 372 unittest::TestAllTypes message; 373 374 const char* value = "\0lalala\0\0"; 375 message.set_optional_bytes(value, 9); 376 ASSERT_EQ(9, message.optional_bytes().size()); 377 EXPECT_EQ(0, memcmp(value, message.optional_bytes().data(), 9)); 378 379 message.add_repeated_bytes(value, 9); 380 ASSERT_EQ(9, message.repeated_bytes(0).size()); 381 EXPECT_EQ(0, memcmp(value, message.repeated_bytes(0).data(), 9)); 382 } 383 384 TEST(GeneratedMessageTest, ClearOneField) { 385 // Set every field to a unique value, then clear one value and insure that 386 // only that one value is cleared. 387 unittest::TestAllTypes message; 388 389 TestUtil::SetAllFields(&message); 390 int64 original_value = message.optional_int64(); 391 392 // Clear the field and make sure it shows up as cleared. 393 message.clear_optional_int64(); 394 EXPECT_FALSE(message.has_optional_int64()); 395 EXPECT_EQ(0, message.optional_int64()); 396 397 // Other adjacent fields should not be cleared. 398 EXPECT_TRUE(message.has_optional_int32()); 399 EXPECT_TRUE(message.has_optional_uint32()); 400 401 // Make sure if we set it again, then all fields are set. 402 message.set_optional_int64(original_value); 403 TestUtil::ExpectAllFieldsSet(message); 404 } 405 406 TEST(GeneratedMessageTest, StringCharStarLength) { 407 // Verify that we can use a char*,length to set one of the string fields. 408 unittest::TestAllTypes message; 409 message.set_optional_string("abcdef", 3); 410 EXPECT_EQ("abc", message.optional_string()); 411 412 // Verify that we can use a char*,length to add to a repeated string field. 413 message.add_repeated_string("abcdef", 3); 414 EXPECT_EQ(1, message.repeated_string_size()); 415 EXPECT_EQ("abc", message.repeated_string(0)); 416 417 // Verify that we can use a char*,length to set a repeated string field. 418 message.set_repeated_string(0, "wxyz", 2); 419 EXPECT_EQ("wx", message.repeated_string(0)); 420 } 421 422 423 TEST(GeneratedMessageTest, CopyFrom) { 424 unittest::TestAllTypes message1, message2; 425 426 TestUtil::SetAllFields(&message1); 427 message2.CopyFrom(message1); 428 TestUtil::ExpectAllFieldsSet(message2); 429 430 // Copying from self should be a no-op. 431 message2.CopyFrom(message2); 432 TestUtil::ExpectAllFieldsSet(message2); 433 } 434 435 436 TEST(GeneratedMessageTest, SwapWithEmpty) { 437 unittest::TestAllTypes message1, message2; 438 TestUtil::SetAllFields(&message1); 439 440 TestUtil::ExpectAllFieldsSet(message1); 441 TestUtil::ExpectClear(message2); 442 message1.Swap(&message2); 443 TestUtil::ExpectAllFieldsSet(message2); 444 TestUtil::ExpectClear(message1); 445 } 446 447 TEST(GeneratedMessageTest, SwapWithSelf) { 448 unittest::TestAllTypes message; 449 TestUtil::SetAllFields(&message); 450 TestUtil::ExpectAllFieldsSet(message); 451 message.Swap(&message); 452 TestUtil::ExpectAllFieldsSet(message); 453 } 454 455 TEST(GeneratedMessageTest, SwapWithOther) { 456 unittest::TestAllTypes message1, message2; 457 458 message1.set_optional_int32(123); 459 message1.set_optional_string("abc"); 460 message1.mutable_optional_nested_message()->set_bb(1); 461 message1.set_optional_nested_enum(unittest::TestAllTypes::FOO); 462 message1.add_repeated_int32(1); 463 message1.add_repeated_int32(2); 464 message1.add_repeated_string("a"); 465 message1.add_repeated_string("b"); 466 message1.add_repeated_nested_message()->set_bb(7); 467 message1.add_repeated_nested_message()->set_bb(8); 468 message1.add_repeated_nested_enum(unittest::TestAllTypes::FOO); 469 message1.add_repeated_nested_enum(unittest::TestAllTypes::BAR); 470 471 message2.set_optional_int32(456); 472 message2.set_optional_string("def"); 473 message2.mutable_optional_nested_message()->set_bb(2); 474 message2.set_optional_nested_enum(unittest::TestAllTypes::BAR); 475 message2.add_repeated_int32(3); 476 message2.add_repeated_string("c"); 477 message2.add_repeated_nested_message()->set_bb(9); 478 message2.add_repeated_nested_enum(unittest::TestAllTypes::BAZ); 479 480 message1.Swap(&message2); 481 482 EXPECT_EQ(456, message1.optional_int32()); 483 EXPECT_EQ("def", message1.optional_string()); 484 EXPECT_EQ(2, message1.optional_nested_message().bb()); 485 EXPECT_EQ(unittest::TestAllTypes::BAR, message1.optional_nested_enum()); 486 ASSERT_EQ(1, message1.repeated_int32_size()); 487 EXPECT_EQ(3, message1.repeated_int32(0)); 488 ASSERT_EQ(1, message1.repeated_string_size()); 489 EXPECT_EQ("c", message1.repeated_string(0)); 490 ASSERT_EQ(1, message1.repeated_nested_message_size()); 491 EXPECT_EQ(9, message1.repeated_nested_message(0).bb()); 492 ASSERT_EQ(1, message1.repeated_nested_enum_size()); 493 EXPECT_EQ(unittest::TestAllTypes::BAZ, message1.repeated_nested_enum(0)); 494 495 EXPECT_EQ(123, message2.optional_int32()); 496 EXPECT_EQ("abc", message2.optional_string()); 497 EXPECT_EQ(1, message2.optional_nested_message().bb()); 498 EXPECT_EQ(unittest::TestAllTypes::FOO, message2.optional_nested_enum()); 499 ASSERT_EQ(2, message2.repeated_int32_size()); 500 EXPECT_EQ(1, message2.repeated_int32(0)); 501 EXPECT_EQ(2, message2.repeated_int32(1)); 502 ASSERT_EQ(2, message2.repeated_string_size()); 503 EXPECT_EQ("a", message2.repeated_string(0)); 504 EXPECT_EQ("b", message2.repeated_string(1)); 505 ASSERT_EQ(2, message2.repeated_nested_message_size()); 506 EXPECT_EQ(7, message2.repeated_nested_message(0).bb()); 507 EXPECT_EQ(8, message2.repeated_nested_message(1).bb()); 508 ASSERT_EQ(2, message2.repeated_nested_enum_size()); 509 EXPECT_EQ(unittest::TestAllTypes::FOO, message2.repeated_nested_enum(0)); 510 EXPECT_EQ(unittest::TestAllTypes::BAR, message2.repeated_nested_enum(1)); 511 } 512 513 TEST(GeneratedMessageTest, CopyConstructor) { 514 unittest::TestAllTypes message1; 515 TestUtil::SetAllFields(&message1); 516 517 unittest::TestAllTypes message2(message1); 518 TestUtil::ExpectAllFieldsSet(message2); 519 } 520 521 TEST(GeneratedMessageTest, CopyAssignmentOperator) { 522 unittest::TestAllTypes message1; 523 TestUtil::SetAllFields(&message1); 524 525 unittest::TestAllTypes message2; 526 message2 = message1; 527 TestUtil::ExpectAllFieldsSet(message2); 528 529 // Make sure that self-assignment does something sane. 530 message2.operator=(message2); 531 TestUtil::ExpectAllFieldsSet(message2); 532 } 533 534 #if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \ 535 !defined(GOOGLE_PROTOBUF_NO_RTTI) 536 TEST(GeneratedMessageTest, UpcastCopyFrom) { 537 // Test the CopyFrom method that takes in the generic const Message& 538 // parameter. 539 unittest::TestAllTypes message1, message2; 540 541 TestUtil::SetAllFields(&message1); 542 543 const Message* source = implicit_cast<const Message*>(&message1); 544 message2.CopyFrom(*source); 545 546 TestUtil::ExpectAllFieldsSet(message2); 547 } 548 #endif 549 550 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS 551 552 TEST(GeneratedMessageTest, DynamicMessageCopyFrom) { 553 // Test copying from a DynamicMessage, which must fall back to using 554 // reflection. 555 unittest::TestAllTypes message2; 556 557 // Construct a new version of the dynamic message via the factory. 558 DynamicMessageFactory factory; 559 google::protobuf::scoped_ptr<Message> message1; 560 message1.reset(factory.GetPrototype( 561 unittest::TestAllTypes::descriptor())->New()); 562 563 TestUtil::ReflectionTester reflection_tester( 564 unittest::TestAllTypes::descriptor()); 565 reflection_tester.SetAllFieldsViaReflection(message1.get()); 566 567 message2.CopyFrom(*message1); 568 569 TestUtil::ExpectAllFieldsSet(message2); 570 } 571 572 #endif // !PROTOBUF_TEST_NO_DESCRIPTORS 573 574 TEST(GeneratedMessageTest, NonEmptyMergeFrom) { 575 // Test merging with a non-empty message. Code is a modified form 576 // of that found in google/protobuf/reflection_ops_unittest.cc. 577 unittest::TestAllTypes message1, message2; 578 579 TestUtil::SetAllFields(&message1); 580 581 // This field will test merging into an empty spot. 582 message2.set_optional_int32(message1.optional_int32()); 583 message1.clear_optional_int32(); 584 585 // This tests overwriting. 586 message2.set_optional_string(message1.optional_string()); 587 message1.set_optional_string("something else"); 588 589 // This tests concatenating. 590 message2.add_repeated_int32(message1.repeated_int32(1)); 591 int32 i = message1.repeated_int32(0); 592 message1.clear_repeated_int32(); 593 message1.add_repeated_int32(i); 594 595 message1.MergeFrom(message2); 596 597 TestUtil::ExpectAllFieldsSet(message1); 598 } 599 600 #if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \ 601 !defined(GOOGLE_PROTOBUF_NO_RTTI) 602 #ifdef PROTOBUF_HAS_DEATH_TEST 603 604 TEST(GeneratedMessageTest, MergeFromSelf) { 605 unittest::TestAllTypes message; 606 EXPECT_DEATH(message.MergeFrom(message), "Check failed:.*pb[.]cc"); 607 EXPECT_DEATH(message.MergeFrom(implicit_cast<const Message&>(message)), 608 "Check failed:.*pb[.]cc"); 609 } 610 611 #endif // PROTOBUF_HAS_DEATH_TEST 612 #endif // !PROTOBUF_TEST_NO_DESCRIPTORS || !GOOGLE_PROTOBUF_NO_RTTI 613 614 // Test the generated SerializeWithCachedSizesToArray(), 615 TEST(GeneratedMessageTest, SerializationToArray) { 616 unittest::TestAllTypes message1, message2; 617 string data; 618 TestUtil::SetAllFields(&message1); 619 int size = message1.ByteSize(); 620 data.resize(size); 621 uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 622 uint8* end = message1.SerializeWithCachedSizesToArray(start); 623 EXPECT_EQ(size, end - start); 624 EXPECT_TRUE(message2.ParseFromString(data)); 625 TestUtil::ExpectAllFieldsSet(message2); 626 627 } 628 629 TEST(GeneratedMessageTest, PackedFieldsSerializationToArray) { 630 unittest::TestPackedTypes packed_message1, packed_message2; 631 string packed_data; 632 TestUtil::SetPackedFields(&packed_message1); 633 int packed_size = packed_message1.ByteSize(); 634 packed_data.resize(packed_size); 635 uint8* start = reinterpret_cast<uint8*>(string_as_array(&packed_data)); 636 uint8* end = packed_message1.SerializeWithCachedSizesToArray(start); 637 EXPECT_EQ(packed_size, end - start); 638 EXPECT_TRUE(packed_message2.ParseFromString(packed_data)); 639 TestUtil::ExpectPackedFieldsSet(packed_message2); 640 } 641 642 // Test the generated SerializeWithCachedSizes() by forcing the buffer to write 643 // one byte at a time. 644 TEST(GeneratedMessageTest, SerializationToStream) { 645 unittest::TestAllTypes message1, message2; 646 TestUtil::SetAllFields(&message1); 647 int size = message1.ByteSize(); 648 string data; 649 data.resize(size); 650 { 651 // Allow the output stream to buffer only one byte at a time. 652 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 653 io::CodedOutputStream output_stream(&array_stream); 654 message1.SerializeWithCachedSizes(&output_stream); 655 EXPECT_FALSE(output_stream.HadError()); 656 EXPECT_EQ(size, output_stream.ByteCount()); 657 } 658 EXPECT_TRUE(message2.ParseFromString(data)); 659 TestUtil::ExpectAllFieldsSet(message2); 660 661 } 662 663 TEST(GeneratedMessageTest, PackedFieldsSerializationToStream) { 664 unittest::TestPackedTypes message1, message2; 665 TestUtil::SetPackedFields(&message1); 666 int size = message1.ByteSize(); 667 string data; 668 data.resize(size); 669 { 670 // Allow the output stream to buffer only one byte at a time. 671 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 672 io::CodedOutputStream output_stream(&array_stream); 673 message1.SerializeWithCachedSizes(&output_stream); 674 EXPECT_FALSE(output_stream.HadError()); 675 EXPECT_EQ(size, output_stream.ByteCount()); 676 } 677 EXPECT_TRUE(message2.ParseFromString(data)); 678 TestUtil::ExpectPackedFieldsSet(message2); 679 } 680 681 682 TEST(GeneratedMessageTest, Required) { 683 // Test that IsInitialized() returns false if required fields are missing. 684 unittest::TestRequired message; 685 686 EXPECT_FALSE(message.IsInitialized()); 687 message.set_a(1); 688 EXPECT_FALSE(message.IsInitialized()); 689 message.set_b(2); 690 EXPECT_FALSE(message.IsInitialized()); 691 message.set_c(3); 692 EXPECT_TRUE(message.IsInitialized()); 693 } 694 695 TEST(GeneratedMessageTest, RequiredForeign) { 696 // Test that IsInitialized() returns false if required fields in nested 697 // messages are missing. 698 unittest::TestRequiredForeign message; 699 700 EXPECT_TRUE(message.IsInitialized()); 701 702 message.mutable_optional_message(); 703 EXPECT_FALSE(message.IsInitialized()); 704 705 message.mutable_optional_message()->set_a(1); 706 message.mutable_optional_message()->set_b(2); 707 message.mutable_optional_message()->set_c(3); 708 EXPECT_TRUE(message.IsInitialized()); 709 710 message.add_repeated_message(); 711 EXPECT_FALSE(message.IsInitialized()); 712 713 message.mutable_repeated_message(0)->set_a(1); 714 message.mutable_repeated_message(0)->set_b(2); 715 message.mutable_repeated_message(0)->set_c(3); 716 EXPECT_TRUE(message.IsInitialized()); 717 } 718 719 TEST(GeneratedMessageTest, ForeignNested) { 720 // Test that TestAllTypes::NestedMessage can be embedded directly into 721 // another message. 722 unittest::TestForeignNested message; 723 724 // If this compiles and runs without crashing, it must work. We have 725 // nothing more to test. 726 unittest::TestAllTypes::NestedMessage* nested = 727 message.mutable_foreign_nested(); 728 nested->set_bb(1); 729 } 730 731 TEST(GeneratedMessageTest, ReallyLargeTagNumber) { 732 // Test that really large tag numbers don't break anything. 733 unittest::TestReallyLargeTagNumber message1, message2; 734 string data; 735 736 // For the most part, if this compiles and runs then we're probably good. 737 // (The most likely cause for failure would be if something were attempting 738 // to allocate a lookup table of some sort using tag numbers as the index.) 739 // We'll try serializing just for fun. 740 message1.set_a(1234); 741 message1.set_bb(5678); 742 message1.SerializeToString(&data); 743 EXPECT_TRUE(message2.ParseFromString(data)); 744 EXPECT_EQ(1234, message2.a()); 745 EXPECT_EQ(5678, message2.bb()); 746 } 747 748 TEST(GeneratedMessageTest, MutualRecursion) { 749 // Test that mutually-recursive message types work. 750 unittest::TestMutualRecursionA message; 751 unittest::TestMutualRecursionA* nested = message.mutable_bb()->mutable_a(); 752 unittest::TestMutualRecursionA* nested2 = nested->mutable_bb()->mutable_a(); 753 754 // Again, if the above compiles and runs, that's all we really have to 755 // test, but just for run we'll check that the system didn't somehow come 756 // up with a pointer loop... 757 EXPECT_NE(&message, nested); 758 EXPECT_NE(&message, nested2); 759 EXPECT_NE(nested, nested2); 760 } 761 762 TEST(GeneratedMessageTest, CamelCaseFieldNames) { 763 // This test is mainly checking that the following compiles, which verifies 764 // that the field names were coerced to lower-case. 765 // 766 // Protocol buffers standard style is to use lowercase-with-underscores for 767 // field names. Some old proto1 .protos unfortunately used camel-case field 768 // names. In proto1, these names were forced to lower-case. So, we do the 769 // same thing in proto2. 770 771 unittest::TestCamelCaseFieldNames message; 772 773 message.set_primitivefield(2); 774 message.set_stringfield("foo"); 775 message.set_enumfield(unittest::FOREIGN_FOO); 776 message.mutable_messagefield()->set_c(6); 777 778 message.add_repeatedprimitivefield(8); 779 message.add_repeatedstringfield("qux"); 780 message.add_repeatedenumfield(unittest::FOREIGN_BAR); 781 message.add_repeatedmessagefield()->set_c(15); 782 783 EXPECT_EQ(2, message.primitivefield()); 784 EXPECT_EQ("foo", message.stringfield()); 785 EXPECT_EQ(unittest::FOREIGN_FOO, message.enumfield()); 786 EXPECT_EQ(6, message.messagefield().c()); 787 788 EXPECT_EQ(8, message.repeatedprimitivefield(0)); 789 EXPECT_EQ("qux", message.repeatedstringfield(0)); 790 EXPECT_EQ(unittest::FOREIGN_BAR, message.repeatedenumfield(0)); 791 EXPECT_EQ(15, message.repeatedmessagefield(0).c()); 792 } 793 794 TEST(GeneratedMessageTest, TestConflictingSymbolNames) { 795 // test_bad_identifiers.proto successfully compiled, then it works. The 796 // following is just a token usage to insure that the code is, in fact, 797 // being compiled and linked. 798 799 protobuf_unittest::TestConflictingSymbolNames message; 800 message.set_uint32(1); 801 EXPECT_EQ(3, message.ByteSize()); 802 803 message.set_friend_(5); 804 EXPECT_EQ(5, message.friend_()); 805 806 message.set_class_(6); 807 EXPECT_EQ(6, message.class_()); 808 809 // Instantiate extension template functions to test conflicting template 810 // parameter names. 811 typedef protobuf_unittest::TestConflictingSymbolNamesExtension ExtensionMessage; 812 message.AddExtension(ExtensionMessage::repeated_int32_ext, 123); 813 EXPECT_EQ(123, 814 message.GetExtension(ExtensionMessage::repeated_int32_ext, 0)); 815 } 816 817 TEST(GeneratedMessageTest, TestConflictingEnumNames) { 818 protobuf_unittest::TestConflictingEnumNames message; 819 message.set_conflicting_enum(protobuf_unittest::TestConflictingEnumNames_NestedConflictingEnum_and_); 820 EXPECT_EQ(1, message.conflicting_enum()); 821 message.set_conflicting_enum(protobuf_unittest::TestConflictingEnumNames_NestedConflictingEnum_XOR); 822 EXPECT_EQ(5, message.conflicting_enum()); 823 824 825 protobuf_unittest::ConflictingEnum conflicting_enum; 826 conflicting_enum = protobuf_unittest::NOT_EQ; 827 EXPECT_EQ(1, conflicting_enum); 828 conflicting_enum = protobuf_unittest::return_; 829 EXPECT_EQ(3, conflicting_enum); 830 } 831 832 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS 833 834 TEST(GeneratedMessageTest, TestOptimizedForSize) { 835 // We rely on the tests in reflection_ops_unittest and wire_format_unittest 836 // to really test that reflection-based methods work. Here we are mostly 837 // just making sure that TestOptimizedForSize actually builds and seems to 838 // function. 839 840 protobuf_unittest::TestOptimizedForSize message, message2; 841 message.set_i(1); 842 message.mutable_msg()->set_c(2); 843 message2.CopyFrom(message); 844 EXPECT_EQ(1, message2.i()); 845 EXPECT_EQ(2, message2.msg().c()); 846 } 847 848 TEST(GeneratedMessageTest, TestEmbedOptimizedForSize) { 849 // Verifies that something optimized for speed can contain something optimized 850 // for size. 851 852 protobuf_unittest::TestEmbedOptimizedForSize message, message2; 853 message.mutable_optional_message()->set_i(1); 854 message.add_repeated_message()->mutable_msg()->set_c(2); 855 string data; 856 message.SerializeToString(&data); 857 ASSERT_TRUE(message2.ParseFromString(data)); 858 EXPECT_EQ(1, message2.optional_message().i()); 859 EXPECT_EQ(2, message2.repeated_message(0).msg().c()); 860 } 861 862 TEST(GeneratedMessageTest, TestSpaceUsed) { 863 unittest::TestAllTypes message1; 864 // sizeof provides a lower bound on SpaceUsed(). 865 EXPECT_LE(sizeof(unittest::TestAllTypes), message1.SpaceUsed()); 866 const int empty_message_size = message1.SpaceUsed(); 867 868 // Setting primitive types shouldn't affect the space used. 869 message1.set_optional_int32(123); 870 message1.set_optional_int64(12345); 871 message1.set_optional_uint32(123); 872 message1.set_optional_uint64(12345); 873 EXPECT_EQ(empty_message_size, message1.SpaceUsed()); 874 875 // On some STL implementations, setting the string to a small value should 876 // only increase SpaceUsed() by the size of a string object, though this is 877 // not true everywhere. 878 message1.set_optional_string("abc"); 879 EXPECT_LE(empty_message_size + sizeof(string), message1.SpaceUsed()); 880 881 // Setting a string to a value larger than the string object itself should 882 // increase SpaceUsed(), because it cannot store the value internally. 883 message1.set_optional_string(string(sizeof(string) + 1, 'x')); 884 int min_expected_increase = message1.optional_string().capacity() + 885 sizeof(string); 886 EXPECT_LE(empty_message_size + min_expected_increase, 887 message1.SpaceUsed()); 888 889 int previous_size = message1.SpaceUsed(); 890 // Adding an optional message should increase the size by the size of the 891 // nested message type. NestedMessage is simple enough (1 int field) that it 892 // is equal to sizeof(NestedMessage) 893 message1.mutable_optional_nested_message(); 894 ASSERT_EQ(sizeof(unittest::TestAllTypes::NestedMessage), 895 message1.optional_nested_message().SpaceUsed()); 896 EXPECT_EQ(previous_size + 897 sizeof(unittest::TestAllTypes::NestedMessage), 898 message1.SpaceUsed()); 899 } 900 901 TEST(GeneratedMessageTest, TestOneofSpaceUsed) { 902 unittest::TestOneof2 message1; 903 EXPECT_LE(sizeof(unittest::TestOneof2), message1.SpaceUsed()); 904 905 const int empty_message_size = message1.SpaceUsed(); 906 // Setting primitive types shouldn't affect the space used. 907 message1.set_foo_int(123); 908 message1.set_bar_int(12345); 909 EXPECT_EQ(empty_message_size, message1.SpaceUsed()); 910 911 // Setting a string in oneof to a small value should only increase SpaceUsed() 912 // by the size of a string object. 913 message1.set_foo_string("abc"); 914 EXPECT_LE(empty_message_size + sizeof(string), message1.SpaceUsed()); 915 916 // Setting a string in oneof to a value larger than the string object itself 917 // should increase SpaceUsed(), because it cannot store the value internally. 918 message1.set_foo_string(string(sizeof(string) + 1, 'x')); 919 int min_expected_increase = message1.foo_string().capacity() + 920 sizeof(string); 921 EXPECT_LE(empty_message_size + min_expected_increase, 922 message1.SpaceUsed()); 923 924 // Setting a message in oneof should delete the other fields and increase the 925 // size by the size of the nested message type. NestedMessage is simple enough 926 // that it is equal to sizeof(NestedMessage) 927 message1.mutable_foo_message(); 928 ASSERT_EQ(sizeof(unittest::TestOneof2::NestedMessage), 929 message1.foo_message().SpaceUsed()); 930 EXPECT_EQ(empty_message_size + 931 sizeof(unittest::TestOneof2::NestedMessage), 932 message1.SpaceUsed()); 933 } 934 935 #endif // !PROTOBUF_TEST_NO_DESCRIPTORS 936 937 938 TEST(GeneratedMessageTest, FieldConstantValues) { 939 unittest::TestRequired message; 940 EXPECT_EQ(unittest::TestAllTypes_NestedMessage::kBbFieldNumber, 1); 941 EXPECT_EQ(unittest::TestAllTypes::kOptionalInt32FieldNumber, 1); 942 EXPECT_EQ(unittest::TestAllTypes::kOptionalgroupFieldNumber, 16); 943 EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedMessageFieldNumber, 18); 944 EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedEnumFieldNumber, 21); 945 EXPECT_EQ(unittest::TestAllTypes::kRepeatedInt32FieldNumber, 31); 946 EXPECT_EQ(unittest::TestAllTypes::kRepeatedgroupFieldNumber, 46); 947 EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedMessageFieldNumber, 48); 948 EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedEnumFieldNumber, 51); 949 } 950 951 TEST(GeneratedMessageTest, ExtensionConstantValues) { 952 EXPECT_EQ(unittest::TestRequired::kSingleFieldNumber, 1000); 953 EXPECT_EQ(unittest::TestRequired::kMultiFieldNumber, 1001); 954 EXPECT_EQ(unittest::kOptionalInt32ExtensionFieldNumber, 1); 955 EXPECT_EQ(unittest::kOptionalgroupExtensionFieldNumber, 16); 956 EXPECT_EQ(unittest::kOptionalNestedMessageExtensionFieldNumber, 18); 957 EXPECT_EQ(unittest::kOptionalNestedEnumExtensionFieldNumber, 21); 958 EXPECT_EQ(unittest::kRepeatedInt32ExtensionFieldNumber, 31); 959 EXPECT_EQ(unittest::kRepeatedgroupExtensionFieldNumber, 46); 960 EXPECT_EQ(unittest::kRepeatedNestedMessageExtensionFieldNumber, 48); 961 EXPECT_EQ(unittest::kRepeatedNestedEnumExtensionFieldNumber, 51); 962 } 963 964 TEST(GeneratedMessageTest, ParseFromTruncated) { 965 const string long_string = string(128, 'q'); 966 FileDescriptorProto p; 967 p.add_extension()->set_name(long_string); 968 const string msg = p.SerializeAsString(); 969 int successful_count = 0; 970 for (int i = 0; i <= msg.size(); i++) { 971 if (p.ParseFromArray(msg.c_str(), i)) { 972 ++successful_count; 973 } 974 } 975 // We don't really care about how often we succeeded. 976 // As long as we didn't crash, we're happy. 977 EXPECT_GE(successful_count, 1); 978 } 979 980 // =================================================================== 981 982 TEST(GeneratedEnumTest, EnumValuesAsSwitchCases) { 983 // Test that our nested enum values can be used as switch cases. This test 984 // doesn't actually do anything, the proof that it works is that it 985 // compiles. 986 int i =0; 987 unittest::TestAllTypes::NestedEnum a = unittest::TestAllTypes::BAR; 988 switch (a) { 989 case unittest::TestAllTypes::FOO: 990 i = 1; 991 break; 992 case unittest::TestAllTypes::BAR: 993 i = 2; 994 break; 995 case unittest::TestAllTypes::BAZ: 996 i = 3; 997 break; 998 case unittest::TestAllTypes::NEG: 999 i = -1; 1000 break; 1001 // no default case: We want to make sure the compiler recognizes that 1002 // all cases are covered. (GCC warns if you do not cover all cases of 1003 // an enum in a switch.) 1004 } 1005 1006 // Token check just for fun. 1007 EXPECT_EQ(2, i); 1008 } 1009 1010 TEST(GeneratedEnumTest, IsValidValue) { 1011 // Test enum IsValidValue. 1012 EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(1)); 1013 EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(2)); 1014 EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(3)); 1015 1016 EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(0)); 1017 EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(4)); 1018 1019 // Make sure it also works when there are dups. 1020 EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(1)); 1021 EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(2)); 1022 EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(3)); 1023 1024 EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(0)); 1025 EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(4)); 1026 } 1027 1028 TEST(GeneratedEnumTest, MinAndMax) { 1029 EXPECT_EQ(unittest::TestAllTypes::NEG, 1030 unittest::TestAllTypes::NestedEnum_MIN); 1031 EXPECT_EQ(unittest::TestAllTypes::BAZ, 1032 unittest::TestAllTypes::NestedEnum_MAX); 1033 EXPECT_EQ(4, unittest::TestAllTypes::NestedEnum_ARRAYSIZE); 1034 1035 EXPECT_EQ(unittest::FOREIGN_FOO, unittest::ForeignEnum_MIN); 1036 EXPECT_EQ(unittest::FOREIGN_BAZ, unittest::ForeignEnum_MAX); 1037 EXPECT_EQ(7, unittest::ForeignEnum_ARRAYSIZE); 1038 1039 EXPECT_EQ(1, unittest::TestEnumWithDupValue_MIN); 1040 EXPECT_EQ(3, unittest::TestEnumWithDupValue_MAX); 1041 EXPECT_EQ(4, unittest::TestEnumWithDupValue_ARRAYSIZE); 1042 1043 EXPECT_EQ(unittest::SPARSE_E, unittest::TestSparseEnum_MIN); 1044 EXPECT_EQ(unittest::SPARSE_C, unittest::TestSparseEnum_MAX); 1045 EXPECT_EQ(12589235, unittest::TestSparseEnum_ARRAYSIZE); 1046 1047 // Make sure we can take the address of _MIN, _MAX and _ARRAYSIZE. 1048 void* null_pointer = 0; // NULL may be integer-type, not pointer-type. 1049 EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MIN); 1050 EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MAX); 1051 EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_ARRAYSIZE); 1052 1053 EXPECT_NE(null_pointer, &unittest::ForeignEnum_MIN); 1054 EXPECT_NE(null_pointer, &unittest::ForeignEnum_MAX); 1055 EXPECT_NE(null_pointer, &unittest::ForeignEnum_ARRAYSIZE); 1056 1057 // Make sure we can use _MIN and _MAX as switch cases. 1058 switch (unittest::SPARSE_A) { 1059 case unittest::TestSparseEnum_MIN: 1060 case unittest::TestSparseEnum_MAX: 1061 break; 1062 default: 1063 break; 1064 } 1065 } 1066 1067 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS 1068 1069 TEST(GeneratedEnumTest, Name) { 1070 // "Names" in the presence of dup values are a bit arbitrary. 1071 EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO1)); 1072 EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO2)); 1073 1074 EXPECT_EQ("SPARSE_A", unittest::TestSparseEnum_Name(unittest::SPARSE_A)); 1075 EXPECT_EQ("SPARSE_B", unittest::TestSparseEnum_Name(unittest::SPARSE_B)); 1076 EXPECT_EQ("SPARSE_C", unittest::TestSparseEnum_Name(unittest::SPARSE_C)); 1077 EXPECT_EQ("SPARSE_D", unittest::TestSparseEnum_Name(unittest::SPARSE_D)); 1078 EXPECT_EQ("SPARSE_E", unittest::TestSparseEnum_Name(unittest::SPARSE_E)); 1079 EXPECT_EQ("SPARSE_F", unittest::TestSparseEnum_Name(unittest::SPARSE_F)); 1080 EXPECT_EQ("SPARSE_G", unittest::TestSparseEnum_Name(unittest::SPARSE_G)); 1081 } 1082 1083 TEST(GeneratedEnumTest, Parse) { 1084 unittest::TestEnumWithDupValue dup_value = unittest::FOO1; 1085 EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO1", &dup_value)); 1086 EXPECT_EQ(unittest::FOO1, dup_value); 1087 EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO2", &dup_value)); 1088 EXPECT_EQ(unittest::FOO2, dup_value); 1089 EXPECT_FALSE(unittest::TestEnumWithDupValue_Parse("FOO", &dup_value)); 1090 } 1091 1092 TEST(GeneratedEnumTest, GetEnumDescriptor) { 1093 EXPECT_EQ(unittest::TestAllTypes::NestedEnum_descriptor(), 1094 GetEnumDescriptor<unittest::TestAllTypes::NestedEnum>()); 1095 EXPECT_EQ(unittest::ForeignEnum_descriptor(), 1096 GetEnumDescriptor<unittest::ForeignEnum>()); 1097 EXPECT_EQ(unittest::TestEnumWithDupValue_descriptor(), 1098 GetEnumDescriptor<unittest::TestEnumWithDupValue>()); 1099 EXPECT_EQ(unittest::TestSparseEnum_descriptor(), 1100 GetEnumDescriptor<unittest::TestSparseEnum>()); 1101 } 1102 1103 enum NonProtoEnum { 1104 kFoo = 1, 1105 }; 1106 1107 TEST(GeneratedEnumTest, IsProtoEnumTypeTrait) { 1108 EXPECT_TRUE(is_proto_enum<unittest::TestAllTypes::NestedEnum>::value); 1109 EXPECT_TRUE(is_proto_enum<unittest::ForeignEnum>::value); 1110 EXPECT_TRUE(is_proto_enum<unittest::TestEnumWithDupValue>::value); 1111 EXPECT_TRUE(is_proto_enum<unittest::TestSparseEnum>::value); 1112 1113 EXPECT_FALSE(is_proto_enum<int>::value); 1114 EXPECT_FALSE(is_proto_enum<NonProtoEnum>::value); 1115 } 1116 1117 #endif // PROTOBUF_TEST_NO_DESCRIPTORS 1118 1119 // =================================================================== 1120 1121 #ifndef PROTOBUF_TEST_NO_DESCRIPTORS 1122 1123 // Support code for testing services. 1124 class GeneratedServiceTest : public testing::Test { 1125 protected: 1126 class MockTestService : public unittest::TestService { 1127 public: 1128 MockTestService() 1129 : called_(false), 1130 method_(""), 1131 controller_(NULL), 1132 request_(NULL), 1133 response_(NULL), 1134 done_(NULL) {} 1135 1136 ~MockTestService() {} 1137 1138 void Reset() { called_ = false; } 1139 1140 // implements TestService ---------------------------------------- 1141 1142 void Foo(RpcController* controller, 1143 const unittest::FooRequest* request, 1144 unittest::FooResponse* response, 1145 Closure* done) { 1146 ASSERT_FALSE(called_); 1147 called_ = true; 1148 method_ = "Foo"; 1149 controller_ = controller; 1150 request_ = request; 1151 response_ = response; 1152 done_ = done; 1153 } 1154 1155 void Bar(RpcController* controller, 1156 const unittest::BarRequest* request, 1157 unittest::BarResponse* response, 1158 Closure* done) { 1159 ASSERT_FALSE(called_); 1160 called_ = true; 1161 method_ = "Bar"; 1162 controller_ = controller; 1163 request_ = request; 1164 response_ = response; 1165 done_ = done; 1166 } 1167 1168 // --------------------------------------------------------------- 1169 1170 bool called_; 1171 string method_; 1172 RpcController* controller_; 1173 const Message* request_; 1174 Message* response_; 1175 Closure* done_; 1176 }; 1177 1178 class MockRpcChannel : public RpcChannel { 1179 public: 1180 MockRpcChannel() 1181 : called_(false), 1182 method_(NULL), 1183 controller_(NULL), 1184 request_(NULL), 1185 response_(NULL), 1186 done_(NULL), 1187 destroyed_(NULL) {} 1188 1189 ~MockRpcChannel() { 1190 if (destroyed_ != NULL) *destroyed_ = true; 1191 } 1192 1193 void Reset() { called_ = false; } 1194 1195 // implements TestService ---------------------------------------- 1196 1197 void CallMethod(const MethodDescriptor* method, 1198 RpcController* controller, 1199 const Message* request, 1200 Message* response, 1201 Closure* done) { 1202 ASSERT_FALSE(called_); 1203 called_ = true; 1204 method_ = method; 1205 controller_ = controller; 1206 request_ = request; 1207 response_ = response; 1208 done_ = done; 1209 } 1210 1211 // --------------------------------------------------------------- 1212 1213 bool called_; 1214 const MethodDescriptor* method_; 1215 RpcController* controller_; 1216 const Message* request_; 1217 Message* response_; 1218 Closure* done_; 1219 bool* destroyed_; 1220 }; 1221 1222 class MockController : public RpcController { 1223 public: 1224 void Reset() { 1225 ADD_FAILURE() << "Reset() not expected during this test."; 1226 } 1227 bool Failed() const { 1228 ADD_FAILURE() << "Failed() not expected during this test."; 1229 return false; 1230 } 1231 string ErrorText() const { 1232 ADD_FAILURE() << "ErrorText() not expected during this test."; 1233 return ""; 1234 } 1235 void StartCancel() { 1236 ADD_FAILURE() << "StartCancel() not expected during this test."; 1237 } 1238 void SetFailed(const string& reason) { 1239 ADD_FAILURE() << "SetFailed() not expected during this test."; 1240 } 1241 bool IsCanceled() const { 1242 ADD_FAILURE() << "IsCanceled() not expected during this test."; 1243 return false; 1244 } 1245 void NotifyOnCancel(Closure* callback) { 1246 ADD_FAILURE() << "NotifyOnCancel() not expected during this test."; 1247 } 1248 }; 1249 1250 GeneratedServiceTest() 1251 : descriptor_(unittest::TestService::descriptor()), 1252 foo_(descriptor_->FindMethodByName("Foo")), 1253 bar_(descriptor_->FindMethodByName("Bar")), 1254 stub_(&mock_channel_), 1255 done_(::google::protobuf::internal::NewPermanentCallback(&DoNothing)) {} 1256 1257 virtual void SetUp() { 1258 ASSERT_TRUE(foo_ != NULL); 1259 ASSERT_TRUE(bar_ != NULL); 1260 } 1261 1262 const ServiceDescriptor* descriptor_; 1263 const MethodDescriptor* foo_; 1264 const MethodDescriptor* bar_; 1265 1266 MockTestService mock_service_; 1267 MockController mock_controller_; 1268 1269 MockRpcChannel mock_channel_; 1270 unittest::TestService::Stub stub_; 1271 1272 // Just so we don't have to re-define these with every test. 1273 unittest::FooRequest foo_request_; 1274 unittest::FooResponse foo_response_; 1275 unittest::BarRequest bar_request_; 1276 unittest::BarResponse bar_response_; 1277 google::protobuf::scoped_ptr<Closure> done_; 1278 }; 1279 1280 TEST_F(GeneratedServiceTest, GetDescriptor) { 1281 // Test that GetDescriptor() works. 1282 1283 EXPECT_EQ(descriptor_, mock_service_.GetDescriptor()); 1284 } 1285 1286 TEST_F(GeneratedServiceTest, GetChannel) { 1287 EXPECT_EQ(&mock_channel_, stub_.channel()); 1288 } 1289 1290 TEST_F(GeneratedServiceTest, OwnsChannel) { 1291 MockRpcChannel* channel = new MockRpcChannel; 1292 bool destroyed = false; 1293 channel->destroyed_ = &destroyed; 1294 1295 { 1296 unittest::TestService::Stub owning_stub(channel, 1297 Service::STUB_OWNS_CHANNEL); 1298 EXPECT_FALSE(destroyed); 1299 } 1300 1301 EXPECT_TRUE(destroyed); 1302 } 1303 1304 TEST_F(GeneratedServiceTest, CallMethod) { 1305 // Test that CallMethod() works. 1306 1307 // Call Foo() via CallMethod(). 1308 mock_service_.CallMethod(foo_, &mock_controller_, 1309 &foo_request_, &foo_response_, done_.get()); 1310 1311 ASSERT_TRUE(mock_service_.called_); 1312 1313 EXPECT_EQ("Foo" , mock_service_.method_ ); 1314 EXPECT_EQ(&mock_controller_, mock_service_.controller_); 1315 EXPECT_EQ(&foo_request_ , mock_service_.request_ ); 1316 EXPECT_EQ(&foo_response_ , mock_service_.response_ ); 1317 EXPECT_EQ(done_.get() , mock_service_.done_ ); 1318 1319 // Try again, but call Bar() instead. 1320 mock_service_.Reset(); 1321 mock_service_.CallMethod(bar_, &mock_controller_, 1322 &bar_request_, &bar_response_, done_.get()); 1323 1324 ASSERT_TRUE(mock_service_.called_); 1325 EXPECT_EQ("Bar", mock_service_.method_); 1326 } 1327 1328 TEST_F(GeneratedServiceTest, CallMethodTypeFailure) { 1329 // Verify death if we call Foo() with Bar's message types. 1330 1331 #ifdef PROTOBUF_HAS_DEATH_TEST // death tests do not work on Windows yet 1332 EXPECT_DEBUG_DEATH( 1333 mock_service_.CallMethod(foo_, &mock_controller_, 1334 &foo_request_, &bar_response_, done_.get()), 1335 "dynamic_cast"); 1336 1337 mock_service_.Reset(); 1338 EXPECT_DEBUG_DEATH( 1339 mock_service_.CallMethod(foo_, &mock_controller_, 1340 &bar_request_, &foo_response_, done_.get()), 1341 "dynamic_cast"); 1342 #endif // PROTOBUF_HAS_DEATH_TEST 1343 } 1344 1345 TEST_F(GeneratedServiceTest, GetPrototypes) { 1346 // Test Get{Request,Response}Prototype() methods. 1347 1348 EXPECT_EQ(&unittest::FooRequest::default_instance(), 1349 &mock_service_.GetRequestPrototype(foo_)); 1350 EXPECT_EQ(&unittest::BarRequest::default_instance(), 1351 &mock_service_.GetRequestPrototype(bar_)); 1352 1353 EXPECT_EQ(&unittest::FooResponse::default_instance(), 1354 &mock_service_.GetResponsePrototype(foo_)); 1355 EXPECT_EQ(&unittest::BarResponse::default_instance(), 1356 &mock_service_.GetResponsePrototype(bar_)); 1357 } 1358 1359 TEST_F(GeneratedServiceTest, Stub) { 1360 // Test that the stub class works. 1361 1362 // Call Foo() via the stub. 1363 stub_.Foo(&mock_controller_, &foo_request_, &foo_response_, done_.get()); 1364 1365 ASSERT_TRUE(mock_channel_.called_); 1366 1367 EXPECT_EQ(foo_ , mock_channel_.method_ ); 1368 EXPECT_EQ(&mock_controller_, mock_channel_.controller_); 1369 EXPECT_EQ(&foo_request_ , mock_channel_.request_ ); 1370 EXPECT_EQ(&foo_response_ , mock_channel_.response_ ); 1371 EXPECT_EQ(done_.get() , mock_channel_.done_ ); 1372 1373 // Call Bar() via the stub. 1374 mock_channel_.Reset(); 1375 stub_.Bar(&mock_controller_, &bar_request_, &bar_response_, done_.get()); 1376 1377 ASSERT_TRUE(mock_channel_.called_); 1378 EXPECT_EQ(bar_, mock_channel_.method_); 1379 } 1380 1381 TEST_F(GeneratedServiceTest, NotImplemented) { 1382 // Test that failing to implement a method of a service causes it to fail 1383 // with a "not implemented" error message. 1384 1385 // A service which doesn't implement any methods. 1386 class UnimplementedService : public unittest::TestService { 1387 public: 1388 UnimplementedService() {} 1389 }; 1390 1391 UnimplementedService unimplemented_service; 1392 1393 // And a controller which expects to get a "not implemented" error. 1394 class ExpectUnimplementedController : public MockController { 1395 public: 1396 ExpectUnimplementedController() : called_(false) {} 1397 1398 void SetFailed(const string& reason) { 1399 EXPECT_FALSE(called_); 1400 called_ = true; 1401 EXPECT_EQ("Method Foo() not implemented.", reason); 1402 } 1403 1404 bool called_; 1405 }; 1406 1407 ExpectUnimplementedController controller; 1408 1409 // Call Foo. 1410 unimplemented_service.Foo(&controller, &foo_request_, &foo_response_, 1411 done_.get()); 1412 1413 EXPECT_TRUE(controller.called_); 1414 } 1415 1416 // =================================================================== 1417 1418 class OneofTest : public testing::Test { 1419 protected: 1420 virtual void SetUp() { 1421 } 1422 1423 void ExpectEnumCasesWork(const unittest::TestOneof2 &message) { 1424 switch (message.foo_case()) { 1425 case unittest::TestOneof2::kFooInt: 1426 EXPECT_TRUE(message.has_foo_int()); 1427 break; 1428 case unittest::TestOneof2::kFooString: 1429 EXPECT_TRUE(message.has_foo_string()); 1430 break; 1431 case unittest::TestOneof2::kFooCord: 1432 EXPECT_TRUE(message.has_foo_cord()); 1433 break; 1434 case unittest::TestOneof2::kFooStringPiece: 1435 EXPECT_TRUE(message.has_foo_string_piece()); 1436 break; 1437 case unittest::TestOneof2::kFooBytes: 1438 EXPECT_TRUE(message.has_foo_bytes()); 1439 break; 1440 case unittest::TestOneof2::kFooEnum: 1441 EXPECT_TRUE(message.has_foo_enum()); 1442 break; 1443 case unittest::TestOneof2::kFooMessage: 1444 EXPECT_TRUE(message.has_foo_message()); 1445 break; 1446 case unittest::TestOneof2::kFoogroup: 1447 EXPECT_TRUE(message.has_foogroup()); 1448 break; 1449 case unittest::TestOneof2::kFooLazyMessage: 1450 EXPECT_TRUE(message.has_foo_lazy_message()); 1451 break; 1452 case unittest::TestOneof2::FOO_NOT_SET: 1453 break; 1454 } 1455 } 1456 }; 1457 1458 TEST_F(OneofTest, SettingOneFieldClearsOthers) { 1459 unittest::TestOneof2 message; 1460 1461 message.set_foo_int(123); 1462 EXPECT_TRUE(message.has_foo_int()); 1463 TestUtil::ExpectAtMostOneFieldSetInOneof(message); 1464 1465 message.set_foo_string("foo"); 1466 EXPECT_TRUE(message.has_foo_string()); 1467 TestUtil::ExpectAtMostOneFieldSetInOneof(message); 1468 1469 1470 message.set_foo_bytes("qux"); 1471 EXPECT_TRUE(message.has_foo_bytes()); 1472 TestUtil::ExpectAtMostOneFieldSetInOneof(message); 1473 1474 message.set_foo_enum(unittest::TestOneof2::FOO); 1475 EXPECT_TRUE(message.has_foo_enum()); 1476 TestUtil::ExpectAtMostOneFieldSetInOneof(message); 1477 1478 message.mutable_foo_message()->set_qux_int(234); 1479 EXPECT_TRUE(message.has_foo_message()); 1480 TestUtil::ExpectAtMostOneFieldSetInOneof(message); 1481 1482 message.mutable_foogroup()->set_a(345); 1483 EXPECT_TRUE(message.has_foogroup()); 1484 TestUtil::ExpectAtMostOneFieldSetInOneof(message); 1485 1486 1487 // we repeat this because we didn't test if this properly clears other fields 1488 // at the beginning. 1489 message.set_foo_int(123); 1490 EXPECT_TRUE(message.has_foo_int()); 1491 TestUtil::ExpectAtMostOneFieldSetInOneof(message); 1492 } 1493 1494 TEST_F(OneofTest, EnumCases) { 1495 unittest::TestOneof2 message; 1496 1497 message.set_foo_int(123); 1498 ExpectEnumCasesWork(message); 1499 message.set_foo_string("foo"); 1500 ExpectEnumCasesWork(message); 1501 message.set_foo_bytes("qux"); 1502 ExpectEnumCasesWork(message); 1503 message.set_foo_enum(unittest::TestOneof2::FOO); 1504 ExpectEnumCasesWork(message); 1505 message.mutable_foo_message()->set_qux_int(234); 1506 ExpectEnumCasesWork(message); 1507 message.mutable_foogroup()->set_a(345); 1508 ExpectEnumCasesWork(message); 1509 } 1510 1511 TEST_F(OneofTest, PrimitiveType) { 1512 unittest::TestOneof2 message; 1513 // Unset field returns default value 1514 EXPECT_EQ(message.foo_int(), 0); 1515 1516 message.set_foo_int(123); 1517 EXPECT_TRUE(message.has_foo_int()); 1518 EXPECT_EQ(message.foo_int(), 123); 1519 message.clear_foo_int(); 1520 EXPECT_FALSE(message.has_foo_int()); 1521 } 1522 1523 TEST_F(OneofTest, EnumType) { 1524 unittest::TestOneof2 message; 1525 // Unset field returns default value 1526 EXPECT_EQ(message.foo_enum(), 1); 1527 1528 message.set_foo_enum(unittest::TestOneof2::FOO); 1529 EXPECT_TRUE(message.has_foo_enum()); 1530 EXPECT_EQ(message.foo_enum(), unittest::TestOneof2::FOO); 1531 message.clear_foo_enum(); 1532 EXPECT_FALSE(message.has_foo_enum()); 1533 } 1534 1535 TEST_F(OneofTest, SetString) { 1536 // Check that setting a string field in various ways works 1537 unittest::TestOneof2 message; 1538 1539 // Unset field returns default value 1540 EXPECT_EQ(message.foo_string(), ""); 1541 1542 message.set_foo_string("foo"); 1543 EXPECT_TRUE(message.has_foo_string()); 1544 EXPECT_EQ(message.foo_string(), "foo"); 1545 message.clear_foo_string(); 1546 EXPECT_FALSE(message.has_foo_string()); 1547 1548 message.set_foo_string(string("bar")); 1549 EXPECT_TRUE(message.has_foo_string()); 1550 EXPECT_EQ(message.foo_string(), "bar"); 1551 message.clear_foo_string(); 1552 EXPECT_FALSE(message.has_foo_string()); 1553 1554 1555 message.set_foo_string("qux", 3); 1556 EXPECT_TRUE(message.has_foo_string()); 1557 EXPECT_EQ(message.foo_string(), "qux"); 1558 message.clear_foo_string(); 1559 EXPECT_FALSE(message.has_foo_string()); 1560 1561 message.mutable_foo_string()->assign("quux"); 1562 EXPECT_TRUE(message.has_foo_string()); 1563 EXPECT_EQ(message.foo_string(), "quux"); 1564 message.clear_foo_string(); 1565 EXPECT_FALSE(message.has_foo_string()); 1566 1567 message.set_foo_string("corge"); 1568 EXPECT_TRUE(message.has_foo_string()); 1569 EXPECT_EQ(message.foo_string(), "corge"); 1570 message.clear_foo_string(); 1571 EXPECT_FALSE(message.has_foo_string()); 1572 } 1573 1574 TEST_F(OneofTest, ReleaseString) { 1575 // Check that release_foo() starts out NULL, and gives us a value 1576 // that we can delete after it's been set. 1577 unittest::TestOneof2 message; 1578 1579 EXPECT_EQ(NULL, message.release_foo_string()); 1580 EXPECT_FALSE(message.has_foo_string()); 1581 1582 message.set_foo_string("blah"); 1583 EXPECT_TRUE(message.has_foo_string()); 1584 google::protobuf::scoped_ptr<string> str(message.release_foo_string()); 1585 EXPECT_FALSE(message.has_foo_string()); 1586 ASSERT_TRUE(str != NULL); 1587 EXPECT_EQ("blah", *str); 1588 1589 EXPECT_EQ(NULL, message.release_foo_string()); 1590 EXPECT_FALSE(message.has_foo_string()); 1591 } 1592 1593 TEST_F(OneofTest, SetAllocatedString) { 1594 // Check that set_allocated_foo() works for strings. 1595 unittest::TestOneof2 message; 1596 1597 EXPECT_FALSE(message.has_foo_string()); 1598 const string kHello("hello"); 1599 message.set_foo_string(kHello); 1600 EXPECT_TRUE(message.has_foo_string()); 1601 1602 message.set_allocated_foo_string(NULL); 1603 EXPECT_FALSE(message.has_foo_string()); 1604 EXPECT_EQ("", message.foo_string()); 1605 1606 message.set_allocated_foo_string(new string(kHello)); 1607 EXPECT_TRUE(message.has_foo_string()); 1608 EXPECT_EQ(kHello, message.foo_string()); 1609 } 1610 1611 1612 TEST_F(OneofTest, SetMessage) { 1613 // Check that setting a message field works 1614 unittest::TestOneof2 message; 1615 1616 // Unset field returns default instance 1617 EXPECT_EQ(&message.foo_message(), 1618 &unittest::TestOneof2_NestedMessage::default_instance()); 1619 EXPECT_EQ(message.foo_message().qux_int(), 0); 1620 1621 message.mutable_foo_message()->set_qux_int(234); 1622 EXPECT_TRUE(message.has_foo_message()); 1623 EXPECT_EQ(message.foo_message().qux_int(), 234); 1624 message.clear_foo_message(); 1625 EXPECT_FALSE(message.has_foo_message()); 1626 } 1627 1628 TEST_F(OneofTest, ReleaseMessage) { 1629 // Check that release_foo() starts out NULL, and gives us a value 1630 // that we can delete after it's been set. 1631 unittest::TestOneof2 message; 1632 1633 EXPECT_EQ(NULL, message.release_foo_message()); 1634 EXPECT_FALSE(message.has_foo_message()); 1635 1636 message.mutable_foo_message()->set_qux_int(1); 1637 EXPECT_TRUE(message.has_foo_message()); 1638 google::protobuf::scoped_ptr<unittest::TestOneof2_NestedMessage> mes( 1639 message.release_foo_message()); 1640 EXPECT_FALSE(message.has_foo_message()); 1641 ASSERT_TRUE(mes != NULL); 1642 EXPECT_EQ(1, mes->qux_int()); 1643 1644 EXPECT_EQ(NULL, message.release_foo_message()); 1645 EXPECT_FALSE(message.has_foo_message()); 1646 } 1647 1648 TEST_F(OneofTest, SetAllocatedMessage) { 1649 // Check that set_allocated_foo() works for messages. 1650 unittest::TestOneof2 message; 1651 1652 EXPECT_FALSE(message.has_foo_message()); 1653 1654 message.mutable_foo_message()->set_qux_int(1); 1655 EXPECT_TRUE(message.has_foo_message()); 1656 1657 message.set_allocated_foo_message(NULL); 1658 EXPECT_FALSE(message.has_foo_message()); 1659 EXPECT_EQ(&message.foo_message(), 1660 &unittest::TestOneof2_NestedMessage::default_instance()); 1661 1662 message.mutable_foo_message()->set_qux_int(1); 1663 unittest::TestOneof2_NestedMessage* mes = message.release_foo_message(); 1664 ASSERT_TRUE(mes != NULL); 1665 EXPECT_FALSE(message.has_foo_message()); 1666 1667 message.set_allocated_foo_message(mes); 1668 EXPECT_TRUE(message.has_foo_message()); 1669 EXPECT_EQ(1, message.foo_message().qux_int()); 1670 } 1671 1672 1673 TEST_F(OneofTest, Clear) { 1674 unittest::TestOneof2 message; 1675 1676 message.set_foo_int(1); 1677 EXPECT_TRUE(message.has_foo_int()); 1678 message.clear_foo_int(); 1679 EXPECT_FALSE(message.has_foo_int()); 1680 } 1681 1682 TEST_F(OneofTest, Defaults) { 1683 unittest::TestOneof2 message; 1684 1685 EXPECT_FALSE(message.has_foo_int()); 1686 EXPECT_EQ(message.foo_int(), 0); 1687 1688 EXPECT_FALSE(message.has_foo_string()); 1689 EXPECT_EQ(message.foo_string(), ""); 1690 1691 1692 EXPECT_FALSE(message.has_foo_bytes()); 1693 EXPECT_EQ(message.foo_bytes(), ""); 1694 1695 EXPECT_FALSE(message.has_foo_enum()); 1696 EXPECT_EQ(message.foo_enum(), 1); 1697 1698 EXPECT_FALSE(message.has_foo_message()); 1699 EXPECT_EQ(message.foo_message().qux_int(), 0); 1700 1701 EXPECT_FALSE(message.has_foogroup()); 1702 EXPECT_EQ(message.foogroup().a(), 0); 1703 1704 1705 EXPECT_FALSE(message.has_bar_int()); 1706 EXPECT_EQ(message.bar_int(), 5); 1707 1708 EXPECT_FALSE(message.has_bar_string()); 1709 EXPECT_EQ(message.bar_string(), "STRING"); 1710 1711 1712 EXPECT_FALSE(message.has_bar_bytes()); 1713 EXPECT_EQ(message.bar_bytes(), "BYTES"); 1714 1715 EXPECT_FALSE(message.has_bar_enum()); 1716 EXPECT_EQ(message.bar_enum(), 2); 1717 } 1718 1719 TEST_F(OneofTest, SwapWithEmpty) { 1720 unittest::TestOneof2 message1, message2; 1721 message1.set_foo_string("FOO"); 1722 EXPECT_TRUE(message1.has_foo_string()); 1723 message1.Swap(&message2); 1724 EXPECT_FALSE(message1.has_foo_string()); 1725 EXPECT_TRUE(message2.has_foo_string()); 1726 EXPECT_EQ(message2.foo_string(), "FOO"); 1727 } 1728 1729 TEST_F(OneofTest, SwapWithSelf) { 1730 unittest::TestOneof2 message; 1731 message.set_foo_string("FOO"); 1732 EXPECT_TRUE(message.has_foo_string()); 1733 message.Swap(&message); 1734 EXPECT_TRUE(message.has_foo_string()); 1735 EXPECT_EQ(message.foo_string(), "FOO"); 1736 } 1737 1738 TEST_F(OneofTest, SwapBothHasFields) { 1739 unittest::TestOneof2 message1, message2; 1740 1741 message1.set_foo_string("FOO"); 1742 EXPECT_TRUE(message1.has_foo_string()); 1743 message2.mutable_foo_message()->set_qux_int(1); 1744 EXPECT_TRUE(message2.has_foo_message()); 1745 1746 message1.Swap(&message2); 1747 EXPECT_FALSE(message1.has_foo_string()); 1748 EXPECT_FALSE(message2.has_foo_message()); 1749 EXPECT_TRUE(message1.has_foo_message()); 1750 EXPECT_EQ(message1.foo_message().qux_int(), 1); 1751 EXPECT_TRUE(message2.has_foo_string()); 1752 EXPECT_EQ(message2.foo_string(), "FOO"); 1753 } 1754 1755 TEST_F(OneofTest, CopyConstructor) { 1756 unittest::TestOneof2 message1; 1757 message1.set_foo_bytes("FOO"); 1758 1759 unittest::TestOneof2 message2(message1); 1760 EXPECT_TRUE(message2.has_foo_bytes()); 1761 EXPECT_EQ(message2.foo_bytes(), "FOO"); 1762 } 1763 1764 TEST_F(OneofTest, CopyFrom) { 1765 unittest::TestOneof2 message1, message2; 1766 message1.set_foo_enum(unittest::TestOneof2::BAR); 1767 EXPECT_TRUE(message1.has_foo_enum()); 1768 1769 message2.CopyFrom(message1); 1770 EXPECT_TRUE(message2.has_foo_enum()); 1771 EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::BAR); 1772 1773 // Copying from self should be a no-op. 1774 message2.CopyFrom(message2); 1775 EXPECT_TRUE(message2.has_foo_enum()); 1776 EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::BAR); 1777 } 1778 1779 TEST_F(OneofTest, CopyAssignmentOperator) { 1780 unittest::TestOneof2 message1; 1781 message1.mutable_foo_message()->set_qux_int(123); 1782 EXPECT_TRUE(message1.has_foo_message()); 1783 1784 unittest::TestOneof2 message2; 1785 message2 = message1; 1786 EXPECT_EQ(message2.foo_message().qux_int(), 123); 1787 1788 // Make sure that self-assignment does something sane. 1789 message2 = message2; 1790 EXPECT_EQ(message2.foo_message().qux_int(), 123); 1791 } 1792 1793 TEST_F(OneofTest, UpcastCopyFrom) { 1794 // Test the CopyFrom method that takes in the generic const Message& 1795 // parameter. 1796 unittest::TestOneof2 message1, message2; 1797 message1.mutable_foogroup()->set_a(123); 1798 EXPECT_TRUE(message1.has_foogroup()); 1799 1800 const Message* source = implicit_cast<const Message*>(&message1); 1801 message2.CopyFrom(*source); 1802 1803 EXPECT_TRUE(message2.has_foogroup()); 1804 EXPECT_EQ(message2.foogroup().a(), 123); 1805 } 1806 1807 // Test the generated SerializeWithCachedSizesToArray(), 1808 // This indirectly tests MergePartialFromCodedStream() 1809 // We have to test each field type separately because we cannot set them at the 1810 // same time 1811 TEST_F(OneofTest, SerializationToArray) { 1812 // Primitive type 1813 { 1814 unittest::TestOneof2 message1, message2; 1815 string data; 1816 message1.set_foo_int(123); 1817 int size = message1.ByteSize(); 1818 data.resize(size); 1819 uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 1820 uint8* end = message1.SerializeWithCachedSizesToArray(start); 1821 EXPECT_EQ(size, end - start); 1822 EXPECT_TRUE(message2.ParseFromString(data)); 1823 EXPECT_EQ(message2.foo_int(), 123); 1824 } 1825 1826 // String 1827 { 1828 unittest::TestOneof2 message1, message2; 1829 string data; 1830 message1.set_foo_string("foo"); 1831 int size = message1.ByteSize(); 1832 data.resize(size); 1833 uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 1834 uint8* end = message1.SerializeWithCachedSizesToArray(start); 1835 EXPECT_EQ(size, end - start); 1836 EXPECT_TRUE(message2.ParseFromString(data)); 1837 EXPECT_EQ(message2.foo_string(), "foo"); 1838 } 1839 1840 1841 // Bytes 1842 { 1843 unittest::TestOneof2 message1, message2; 1844 string data; 1845 message1.set_foo_bytes("qux"); 1846 int size = message1.ByteSize(); 1847 data.resize(size); 1848 uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 1849 uint8* end = message1.SerializeWithCachedSizesToArray(start); 1850 EXPECT_EQ(size, end - start); 1851 EXPECT_TRUE(message2.ParseFromString(data)); 1852 EXPECT_EQ(message2.foo_bytes(), "qux"); 1853 } 1854 1855 // Enum 1856 { 1857 unittest::TestOneof2 message1, message2; 1858 string data; 1859 message1.set_foo_enum(unittest::TestOneof2::FOO); 1860 int size = message1.ByteSize(); 1861 data.resize(size); 1862 uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 1863 uint8* end = message1.SerializeWithCachedSizesToArray(start); 1864 EXPECT_EQ(size, end - start); 1865 EXPECT_TRUE(message2.ParseFromString(data)); 1866 EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::FOO); 1867 } 1868 1869 // Message 1870 { 1871 unittest::TestOneof2 message1, message2; 1872 string data; 1873 message1.mutable_foo_message()->set_qux_int(234); 1874 int size = message1.ByteSize(); 1875 data.resize(size); 1876 uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 1877 uint8* end = message1.SerializeWithCachedSizesToArray(start); 1878 EXPECT_EQ(size, end - start); 1879 EXPECT_TRUE(message2.ParseFromString(data)); 1880 EXPECT_EQ(message2.foo_message().qux_int(), 234); 1881 } 1882 1883 // Group 1884 { 1885 unittest::TestOneof2 message1, message2; 1886 string data; 1887 message1.mutable_foogroup()->set_a(345); 1888 int size = message1.ByteSize(); 1889 data.resize(size); 1890 uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 1891 uint8* end = message1.SerializeWithCachedSizesToArray(start); 1892 EXPECT_EQ(size, end - start); 1893 EXPECT_TRUE(message2.ParseFromString(data)); 1894 EXPECT_EQ(message2.foogroup().a(), 345); 1895 } 1896 1897 } 1898 1899 // Test the generated SerializeWithCachedSizes() by forcing the buffer to write 1900 // one byte at a time. 1901 // This indirectly tests MergePartialFromCodedStream() 1902 // We have to test each field type separately because we cannot set them at the 1903 // same time 1904 TEST_F(OneofTest, SerializationToStream) { 1905 // Primitive type 1906 { 1907 unittest::TestOneof2 message1, message2; 1908 string data; 1909 message1.set_foo_int(123); 1910 int size = message1.ByteSize(); 1911 data.resize(size); 1912 1913 { 1914 // Allow the output stream to buffer only one byte at a time. 1915 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 1916 io::CodedOutputStream output_stream(&array_stream); 1917 message1.SerializeWithCachedSizes(&output_stream); 1918 EXPECT_FALSE(output_stream.HadError()); 1919 EXPECT_EQ(size, output_stream.ByteCount()); 1920 } 1921 1922 EXPECT_TRUE(message2.ParseFromString(data)); 1923 EXPECT_EQ(message2.foo_int(), 123); 1924 } 1925 1926 // String 1927 { 1928 unittest::TestOneof2 message1, message2; 1929 string data; 1930 message1.set_foo_string("foo"); 1931 int size = message1.ByteSize(); 1932 data.resize(size); 1933 1934 { 1935 // Allow the output stream to buffer only one byte at a time. 1936 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 1937 io::CodedOutputStream output_stream(&array_stream); 1938 message1.SerializeWithCachedSizes(&output_stream); 1939 EXPECT_FALSE(output_stream.HadError()); 1940 EXPECT_EQ(size, output_stream.ByteCount()); 1941 } 1942 1943 EXPECT_TRUE(message2.ParseFromString(data)); 1944 EXPECT_EQ(message2.foo_string(), "foo"); 1945 } 1946 1947 1948 // Bytes 1949 { 1950 unittest::TestOneof2 message1, message2; 1951 string data; 1952 message1.set_foo_bytes("qux"); 1953 int size = message1.ByteSize(); 1954 data.resize(size); 1955 1956 { 1957 // Allow the output stream to buffer only one byte at a time. 1958 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 1959 io::CodedOutputStream output_stream(&array_stream); 1960 message1.SerializeWithCachedSizes(&output_stream); 1961 EXPECT_FALSE(output_stream.HadError()); 1962 EXPECT_EQ(size, output_stream.ByteCount()); 1963 } 1964 1965 EXPECT_TRUE(message2.ParseFromString(data)); 1966 EXPECT_EQ(message2.foo_bytes(), "qux"); 1967 } 1968 1969 // Enum 1970 { 1971 unittest::TestOneof2 message1, message2; 1972 string data; 1973 message1.set_foo_enum(unittest::TestOneof2::FOO); 1974 int size = message1.ByteSize(); 1975 data.resize(size); 1976 1977 { 1978 // Allow the output stream to buffer only one byte at a time. 1979 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 1980 io::CodedOutputStream output_stream(&array_stream); 1981 message1.SerializeWithCachedSizes(&output_stream); 1982 EXPECT_FALSE(output_stream.HadError()); 1983 EXPECT_EQ(size, output_stream.ByteCount()); 1984 } 1985 1986 EXPECT_TRUE(message2.ParseFromString(data)); 1987 EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::FOO); 1988 } 1989 1990 // Message 1991 { 1992 unittest::TestOneof2 message1, message2; 1993 string data; 1994 message1.mutable_foo_message()->set_qux_int(234); 1995 int size = message1.ByteSize(); 1996 data.resize(size); 1997 1998 { 1999 // Allow the output stream to buffer only one byte at a time. 2000 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 2001 io::CodedOutputStream output_stream(&array_stream); 2002 message1.SerializeWithCachedSizes(&output_stream); 2003 EXPECT_FALSE(output_stream.HadError()); 2004 EXPECT_EQ(size, output_stream.ByteCount()); 2005 } 2006 2007 EXPECT_TRUE(message2.ParseFromString(data)); 2008 EXPECT_EQ(message2.foo_message().qux_int(), 234); 2009 } 2010 2011 // Group 2012 { 2013 unittest::TestOneof2 message1, message2; 2014 string data; 2015 message1.mutable_foogroup()->set_a(345); 2016 int size = message1.ByteSize(); 2017 data.resize(size); 2018 2019 { 2020 // Allow the output stream to buffer only one byte at a time. 2021 io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 2022 io::CodedOutputStream output_stream(&array_stream); 2023 message1.SerializeWithCachedSizes(&output_stream); 2024 EXPECT_FALSE(output_stream.HadError()); 2025 EXPECT_EQ(size, output_stream.ByteCount()); 2026 } 2027 2028 EXPECT_TRUE(message2.ParseFromString(data)); 2029 EXPECT_EQ(message2.foogroup().a(), 345); 2030 } 2031 2032 } 2033 2034 TEST_F(OneofTest, MergeFrom) { 2035 unittest::TestOneof2 message1, message2; 2036 2037 message1.set_foo_int(123); 2038 message2.MergeFrom(message1); 2039 TestUtil::ExpectAtMostOneFieldSetInOneof(message2); 2040 EXPECT_TRUE(message2.has_foo_int()); 2041 EXPECT_EQ(message2.foo_int(), 123); 2042 2043 message1.set_foo_string("foo"); 2044 message2.MergeFrom(message1); 2045 TestUtil::ExpectAtMostOneFieldSetInOneof(message2); 2046 EXPECT_TRUE(message2.has_foo_string()); 2047 EXPECT_EQ(message2.foo_string(), "foo"); 2048 2049 2050 message1.set_foo_bytes("qux"); 2051 message2.MergeFrom(message1); 2052 TestUtil::ExpectAtMostOneFieldSetInOneof(message2); 2053 EXPECT_TRUE(message2.has_foo_bytes()); 2054 EXPECT_EQ(message2.foo_bytes(), "qux"); 2055 2056 message1.set_foo_enum(unittest::TestOneof2::FOO); 2057 message2.MergeFrom(message1); 2058 TestUtil::ExpectAtMostOneFieldSetInOneof(message2); 2059 EXPECT_TRUE(message2.has_foo_enum()); 2060 EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::FOO); 2061 2062 message1.mutable_foo_message()->set_qux_int(234); 2063 message2.MergeFrom(message1); 2064 TestUtil::ExpectAtMostOneFieldSetInOneof(message2); 2065 EXPECT_TRUE(message2.has_foo_message()); 2066 EXPECT_EQ(message2.foo_message().qux_int(), 234); 2067 2068 message1.mutable_foogroup()->set_a(345); 2069 message2.MergeFrom(message1); 2070 TestUtil::ExpectAtMostOneFieldSetInOneof(message2); 2071 EXPECT_TRUE(message2.has_foogroup()); 2072 EXPECT_EQ(message2.foogroup().a(), 345); 2073 2074 } 2075 2076 } // namespace cpp_unittest 2077 } // namespace cpp 2078 } // namespace compiler 2079 2080 namespace no_generic_services_test { 2081 // Verify that no class called "TestService" was defined in 2082 // unittest_no_generic_services.pb.h by defining a different type by the same 2083 // name. If such a service was generated, this will not compile. 2084 struct TestService { 2085 int i; 2086 }; 2087 } 2088 2089 namespace compiler { 2090 namespace cpp { 2091 namespace cpp_unittest { 2092 2093 TEST_F(GeneratedServiceTest, NoGenericServices) { 2094 // Verify that non-services in unittest_no_generic_services.proto were 2095 // generated. 2096 no_generic_services_test::TestMessage message; 2097 message.set_a(1); 2098 message.SetExtension(no_generic_services_test::test_extension, 123); 2099 no_generic_services_test::TestEnum e = no_generic_services_test::FOO; 2100 EXPECT_EQ(e, 1); 2101 2102 // Verify that a ServiceDescriptor is generated for the service even if the 2103 // class itself is not. 2104 const FileDescriptor* file = 2105 no_generic_services_test::TestMessage::descriptor()->file(); 2106 2107 ASSERT_EQ(1, file->service_count()); 2108 EXPECT_EQ("TestService", file->service(0)->name()); 2109 ASSERT_EQ(1, file->service(0)->method_count()); 2110 EXPECT_EQ("Foo", file->service(0)->method(0)->name()); 2111 } 2112 2113 #endif // !PROTOBUF_TEST_NO_DESCRIPTORS 2114 2115 // =================================================================== 2116 2117 // This test must run last. It verifies that descriptors were or were not 2118 // initialized depending on whether PROTOBUF_TEST_NO_DESCRIPTORS was defined. 2119 // When this is defined, we skip all tests which are expected to trigger 2120 // descriptor initialization. This verifies that everything else still works 2121 // if descriptors are not initialized. 2122 TEST(DescriptorInitializationTest, Initialized) { 2123 #ifdef PROTOBUF_TEST_NO_DESCRIPTORS 2124 bool should_have_descriptors = false; 2125 #else 2126 bool should_have_descriptors = true; 2127 #endif 2128 2129 EXPECT_EQ(should_have_descriptors, 2130 DescriptorPool::generated_pool()->InternalIsFileLoaded( 2131 "google/protobuf/unittest.proto")); 2132 } 2133 2134 } // namespace cpp_unittest 2135 2136 } // namespace cpp 2137 } // namespace compiler 2138 } // namespace protobuf 2139 } // namespace google 2140