15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/ 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions of source code must retain the above copyright 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions in binary form must reproduce the above 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Based on original Protocol Buffers design by 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sanjay Ghemawat, Jeff Dean, and others. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To test the code generator, we actually use it to generate code for 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// google/protobuf/unittest.proto, then test that. This means that we 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are actually testing the parser and other parts of the system at the same 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// time, and that problems in the generator may show up as compile-time errors 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rather than unittest failures, which may be surprising. However, testing 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the output of the C++ generator directly would be very hard. We can't very 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well just check it against golden files since those files would have to be 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// updated for any small change; such a test would be very brittle and probably 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not very helpful. What we really want to test is that the code compiles 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly and produces the interfaces we expect, which is why this test 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is written this way. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 473d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch#include <google/protobuf/compiler/cpp/cpp_unittest.h> 483d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/unittest.pb.h> 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/unittest_optimize_for.pb.h> 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/unittest_embed_optimize_for.pb.h> 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/unittest_no_generic_services.pb.h> 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/test_util.h> 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h> 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/importer.h> 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/coded_stream.h> 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/zero_copy_stream_impl.h> 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/descriptor.h> 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/descriptor.pb.h> 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/dynamic_message.h> 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h> 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/strutil.h> 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/substitute.h> 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/testing/googletest.h> 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtest/gtest.h> 693d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch#include <google/protobuf/stubs/stl_util.h> 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace compiler { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cpp { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Can't use an anonymous namespace here due to brokenness of Tru64 compiler. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cpp_unittest { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 793d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochnamespace protobuf_unittest = ::protobuf_unittest; 803d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockErrorCollector : public MultiFileErrorCollector { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockErrorCollector() {} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockErrorCollector() {} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string text_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implements ErrorCollector --------------------------------------- 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddError(const string& filename, int line, int column, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& message) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename, line, column, message); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PROTOBUF_TEST_NO_DESCRIPTORS 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that generated code has proper descriptors: 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parse a descriptor directly (using google::protobuf::compiler::Importer) and 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compare it to the one that was produced by generated code. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedDescriptorTest, IdenticalDescriptors) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileDescriptor* generated_descriptor = 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes::descriptor()->file(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the Importer. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockErrorCollector error_collector; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DiskSourceTree source_tree; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_tree.MapPath("", TestSourceDir()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Importer importer(&source_tree, &error_collector); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Import (parse) unittest.proto. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileDescriptor* parsed_descriptor = 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) importer.Import("google/protobuf/unittest.proto"); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", error_collector.text_); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(parsed_descriptor != NULL); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that descriptors are generated correctly by converting them to 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FileDescriptorProtos and comparing. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileDescriptorProto generated_decsriptor_proto, parsed_descriptor_proto; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generated_descriptor->CopyTo(&generated_decsriptor_proto); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parsed_descriptor->CopyTo(&parsed_descriptor_proto); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(parsed_descriptor_proto.DebugString(), 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generated_decsriptor_proto.DebugString()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !PROTOBUF_TEST_NO_DESCRIPTORS 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// =================================================================== 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, Defaults) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that all default values are set correctly in the initial message. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectClear(message); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Messages should return pointers to default instances until first use. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (This is not checked by ExpectClear() since it is not actually true after 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the fields have been set and then cleared.) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message.optionalgroup()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message.optional_nested_message()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&unittest::ForeignMessage::default_instance(), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message.optional_foreign_message()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message.optional_import_message()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, FloatingPointDefaults) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestExtremeDefaultValues& extreme_default = 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestExtremeDefaultValues::default_instance(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0.0f, extreme_default.zero_float()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1.0f, extreme_default.one_float()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1.5f, extreme_default.small_float()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1.0f, extreme_default.negative_one_float()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1.5f, extreme_default.negative_float()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2.0e8f, extreme_default.large_float()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-8e-28f, extreme_default.small_negative_float()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(numeric_limits<double>::infinity(), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extreme_default.inf_double()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-numeric_limits<double>::infinity(), 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extreme_default.neg_inf_double()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extreme_default.nan_double() != extreme_default.nan_double()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(numeric_limits<float>::infinity(), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extreme_default.inf_float()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-numeric_limits<float>::infinity(), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extreme_default.neg_inf_float()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(extreme_default.nan_float() != extreme_default.nan_float()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, Trigraph) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestExtremeDefaultValues& extreme_default = 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestExtremeDefaultValues::default_instance(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("? ? ?? ?? ??? ?\?/ ?\?-", extreme_default.cpp_trigraph()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1813d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben MurdochTEST(GeneratedMessageTest, ExtremeSmallIntegerDefault) { 1823d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch const unittest::TestExtremeDefaultValues& extreme_default = 1833d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch unittest::TestExtremeDefaultValues::default_instance(); 1843d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(-0x80000000, kint32min); 1853d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(GOOGLE_LONGLONG(-0x8000000000000000), kint64min); 1863d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(kint32min, extreme_default.really_small_int32()); 1873d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(kint64min, extreme_default.really_small_int64()); 1883d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch} 1893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, Accessors) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set every field to a unique value then go back and check all those 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ModifyRepeatedFields(&message); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectRepeatedFieldsModified(message); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, MutableStringDefault) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mutable_foo() for a string should return a string initialized to its 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default value. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello", *message.mutable_default_string()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that the first time we call mutable_foo(), we get a newly-allocated 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // string, but if we clear it and call it again, we get the same object again. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should verify that it has its default value in both cases. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_default_string("blah"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.Clear(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello", *message.mutable_default_string()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2183d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben MurdochTEST(GeneratedMessageTest, StringDefaults) { 2193d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch unittest::TestExtremeDefaultValues message; 2203d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // Check if '\000' can be used in default string value. 2213d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(string("hel\000lo", 6), message.string_with_zero()); 2223d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(string("wor\000ld", 6), message.bytes_with_zero()); 2233d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch} 2243d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, ReleaseString) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that release_foo() starts out NULL, and gives us a value 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that we can delete after it's been set. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, message.release_default_string()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.has_default_string()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello", message.default_string()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_default_string("blah"); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message.has_default_string()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string* str = message.release_default_string(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.has_default_string()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(str != NULL); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("blah", *str); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete str; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, message.release_default_string()); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.has_default_string()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("hello", message.default_string()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, ReleaseMessage) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that release_foo() starts out NULL, and gives us a value 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that we can delete after it's been set. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, message.release_optional_nested_message()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.has_optional_nested_message()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_optional_nested_message()->set_bb(1); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes::NestedMessage* nest = 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.release_optional_nested_message(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.has_optional_nested_message()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(nest != NULL); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, nest->bb()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete nest; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, message.release_optional_nested_message()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.has_optional_nested_message()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2673d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben MurdochTEST(GeneratedMessageTest, SetAllocatedString) { 2683d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // Check that set_allocated_foo() works for strings. 2693d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch unittest::TestAllTypes message; 2703d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2713d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_FALSE(message.has_optional_string()); 2723d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch const string kHello("hello"); 2733d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.set_optional_string(kHello); 2743d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_TRUE(message.has_optional_string()); 2753d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2763d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.set_allocated_optional_string(NULL); 2773d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_FALSE(message.has_optional_string()); 2783d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ("", message.optional_string()); 2793d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2803d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.set_allocated_optional_string(new string(kHello)); 2813d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_TRUE(message.has_optional_string()); 2823d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(kHello, message.optional_string()); 2833d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch} 2843d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2853d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben MurdochTEST(GeneratedMessageTest, SetAllocatedMessage) { 2863d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // Check that set_allocated_foo() can be called in all cases. 2873d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch unittest::TestAllTypes message; 2883d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_FALSE(message.has_optional_nested_message()); 2903d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2913d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.mutable_optional_nested_message()->set_bb(1); 2923d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_TRUE(message.has_optional_nested_message()); 2933d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2943d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.set_allocated_optional_nested_message(NULL); 2953d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_FALSE(message.has_optional_nested_message()); 2963d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), 2973d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch &message.optional_nested_message()); 2983d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 2993d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.mutable_optional_nested_message()->set_bb(1); 3003d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch unittest::TestAllTypes::NestedMessage* nest = 3013d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.release_optional_nested_message(); 3023d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch ASSERT_TRUE(nest != NULL); 3033d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_FALSE(message.has_optional_nested_message()); 3043d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 3053d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.set_allocated_optional_nested_message(nest); 3063d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_TRUE(message.has_optional_nested_message()); 3073d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(1, message.optional_nested_message().bb()); 3083d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch} 3093d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, Clear) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set every field to a unique value, clear the message, then check that 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is cleared. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.Clear(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectClear(message); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unlike with the defaults test, we do NOT expect that requesting embedded 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // messages will return a pointer to the default instance. Instead, they 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should return the objects that were created when mutable_blah() was 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message.optionalgroup()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message.optional_nested_message()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(&unittest::ForeignMessage::default_instance(), 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message.optional_foreign_message()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(&unittest_import::ImportMessage::default_instance(), 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &message.optional_import_message()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, EmbeddedNullsInBytesCharStar) { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* value = "\0lalala\0\0"; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_optional_bytes(value, 9); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(9, message.optional_bytes().size()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(value, message.optional_bytes().data(), 9)); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.add_repeated_bytes(value, 9); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(9, message.repeated_bytes(0).size()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(value, message.repeated_bytes(0).data(), 9)); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, ClearOneField) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set every field to a unique value, then clear one value and insure that 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only that one value is cleared. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 original_value = message.optional_int64(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the field and make sure it shows up as cleared. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.clear_optional_int64(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.has_optional_int64()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, message.optional_int64()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Other adjacent fields should not be cleared. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message.has_optional_int32()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message.has_optional_uint32()); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure if we set it again, then all fields are set. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_optional_int64(original_value); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, StringCharStarLength) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that we can use a char*,length to set one of the string fields. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_optional_string("abcdef", 3); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("abc", message.optional_string()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that we can use a char*,length to add to a repeated string field. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.add_repeated_string("abcdef", 3); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, message.repeated_string_size()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("abc", message.repeated_string(0)); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that we can use a char*,length to set a repeated string field. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_repeated_string(0, "wxyz", 2); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("wx", message.repeated_string(0)); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, CopyFrom) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1, message2; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message1); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.CopyFrom(message1); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copying from self should be a no-op. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.CopyFrom(message2); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, SwapWithEmpty) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1, message2; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message1); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message1); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectClear(message2); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.Swap(&message2); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectClear(message1); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, SwapWithSelf) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.Swap(&message); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, SwapWithOther) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1, message2; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_int32(123); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_string("abc"); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.mutable_optional_nested_message()->set_bb(1); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_nested_enum(unittest::TestAllTypes::FOO); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_int32(1); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_int32(2); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_string("a"); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_string("b"); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_nested_message()->set_bb(7); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_nested_message()->set_bb(8); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_nested_enum(unittest::TestAllTypes::FOO); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_nested_enum(unittest::TestAllTypes::BAR); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.set_optional_int32(456); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.set_optional_string("def"); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.mutable_optional_nested_message()->set_bb(2); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.set_optional_nested_enum(unittest::TestAllTypes::BAR); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.add_repeated_int32(3); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.add_repeated_string("c"); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.add_repeated_nested_message()->set_bb(9); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.add_repeated_nested_enum(unittest::TestAllTypes::BAZ); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.Swap(&message2); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(456, message1.optional_int32()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("def", message1.optional_string()); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, message1.optional_nested_message().bb()); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::BAR, message1.optional_nested_enum()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, message1.repeated_int32_size()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, message1.repeated_int32(0)); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, message1.repeated_string_size()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c", message1.repeated_string(0)); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, message1.repeated_nested_message_size()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(9, message1.repeated_nested_message(0).bb()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, message1.repeated_nested_enum_size()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::BAZ, message1.repeated_nested_enum(0)); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(123, message2.optional_int32()); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("abc", message2.optional_string()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, message2.optional_nested_message().bb()); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::FOO, message2.optional_nested_enum()); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, message2.repeated_int32_size()); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, message2.repeated_int32(0)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, message2.repeated_int32(1)); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, message2.repeated_string_size()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", message2.repeated_string(0)); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", message2.repeated_string(1)); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, message2.repeated_nested_message_size()); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7, message2.repeated_nested_message(0).bb()); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(8, message2.repeated_nested_message(1).bb()); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, message2.repeated_nested_enum_size()); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::FOO, message2.repeated_nested_enum(0)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::BAR, message2.repeated_nested_enum(1)); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, CopyConstructor) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message1); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message2(message1); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, CopyAssignmentOperator) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message1); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message2; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2 = message1; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that self-assignment does something sane. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.operator=(message2); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, UpcastCopyFrom) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test the CopyFrom method that takes in the generic const Message& 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parameter. 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1, message2; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message1); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* source = implicit_cast<const Message*>(&message1); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.CopyFrom(*source); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PROTOBUF_TEST_NO_DESCRIPTORS 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, DynamicMessageCopyFrom) { 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test copying from a DynamicMessage, which must fall back to using 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reflection. 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message2; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct a new version of the dynamic message via the factory. 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DynamicMessageFactory factory; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Message> message1; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.reset(factory.GetPrototype( 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes::descriptor())->New()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ReflectionTester reflection_tester( 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes::descriptor()); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reflection_tester.SetAllFieldsViaReflection(message1.get()); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.CopyFrom(*message1); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !PROTOBUF_TEST_NO_DESCRIPTORS 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, NonEmptyMergeFrom) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test merging with a non-empty message. Code is a modified form 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of that found in google/protobuf/reflection_ops_unittest.cc. 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1, message2; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message1); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This field will test merging into an empty spot. 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.set_optional_int32(message1.optional_int32()); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.clear_optional_int32(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This tests overwriting. 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.set_optional_string(message1.optional_string()); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_string("something else"); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This tests concatenating. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.add_repeated_int32(message1.repeated_int32(1)); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 i = message1.repeated_int32(0); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.clear_repeated_int32(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.add_repeated_int32(i); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.MergeFrom(message2); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message1); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef GTEST_HAS_DEATH_TEST 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, MergeFromSelf) { 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DEATH(message.MergeFrom(message), "&from"); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DEATH(message.MergeFrom(implicit_cast<const Message&>(message)), 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "&from"); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GTEST_HAS_DEATH_TEST 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the generated SerializeWithCachedSizesToArray(), 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, SerializationToArray) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1, message2; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message1); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = message1.ByteSize(); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.resize(size); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* start = reinterpret_cast<uint8*>(string_as_array(&data)); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* end = message1.SerializeWithCachedSizesToArray(start); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size, end - start); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message2.ParseFromString(data)); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, PackedFieldsSerializationToArray) { 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestPackedTypes packed_message1, packed_message2; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string packed_data; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetPackedFields(&packed_message1); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int packed_size = packed_message1.ByteSize(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packed_data.resize(packed_size); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* start = reinterpret_cast<uint8*>(string_as_array(&packed_data)); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* end = packed_message1.SerializeWithCachedSizesToArray(start); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(packed_size, end - start); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(packed_message2.ParseFromString(packed_data)); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectPackedFieldsSet(packed_message2); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the generated SerializeWithCachedSizes() by forcing the buffer to write 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one byte at a time. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, SerializationToStream) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1, message2; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetAllFields(&message1); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = message1.ByteSize(); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.resize(size); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow the output stream to buffer only one byte at a time. 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::CodedOutputStream output_stream(&array_stream); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.SerializeWithCachedSizes(&output_stream); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(output_stream.HadError()); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size, output_stream.ByteCount()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message2.ParseFromString(data)); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectAllFieldsSet(message2); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, PackedFieldsSerializationToStream) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestPackedTypes message1, message2; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::SetPackedFields(&message1); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = message1.ByteSize(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.resize(size); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow the output stream to buffer only one byte at a time. 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::CodedOutputStream output_stream(&array_stream); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.SerializeWithCachedSizes(&output_stream); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(output_stream.HadError()); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(size, output_stream.ByteCount()); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message2.ParseFromString(data)); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestUtil::ExpectPackedFieldsSet(message2); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, Required) { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that IsInitialized() returns false if required fields are missing. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestRequired message; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.IsInitialized()); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_a(1); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.IsInitialized()); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_b(2); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.IsInitialized()); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_c(3); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message.IsInitialized()); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, RequiredForeign) { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that IsInitialized() returns false if required fields in nested 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // messages are missing. 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestRequiredForeign message; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message.IsInitialized()); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_optional_message(); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.IsInitialized()); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_optional_message()->set_a(1); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_optional_message()->set_b(2); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_optional_message()->set_c(3); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message.IsInitialized()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.add_repeated_message(); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(message.IsInitialized()); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_repeated_message(0)->set_a(1); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_repeated_message(0)->set_b(2); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_repeated_message(0)->set_c(3); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message.IsInitialized()); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, ForeignNested) { 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that TestAllTypes::NestedMessage can be embedded directly into 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another message. 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestForeignNested message; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this compiles and runs without crashing, it must work. We have 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nothing more to test. 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes::NestedMessage* nested = 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_foreign_nested(); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested->set_bb(1); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, ReallyLargeTagNumber) { 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that really large tag numbers don't break anything. 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestReallyLargeTagNumber message1, message2; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For the most part, if this compiles and runs then we're probably good. 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (The most likely cause for failure would be if something were attempting 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allocate a lookup table of some sort using tag numbers as the index.) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll try serializing just for fun. 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_a(1234); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_bb(5678); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.SerializeToString(&data); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(message2.ParseFromString(data)); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1234, message2.a()); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5678, message2.bb()); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, MutualRecursion) { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that mutually-recursive message types work. 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestMutualRecursionA message; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestMutualRecursionA* nested = message.mutable_bb()->mutable_a(); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestMutualRecursionA* nested2 = nested->mutable_bb()->mutable_a(); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Again, if the above compiles and runs, that's all we really have to 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test, but just for run we'll check that the system didn't somehow come 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up with a pointer loop... 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(&message, nested); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(&message, nested2); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(nested, nested2); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, CamelCaseFieldNames) { 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This test is mainly checking that the following compiles, which verifies 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the field names were coerced to lower-case. 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Protocol buffers standard style is to use lowercase-with-underscores for 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // field names. Some old proto1 .protos unfortunately used camel-case field 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // names. In proto1, these names were forced to lower-case. So, we do the 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same thing in proto2. 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestCamelCaseFieldNames message; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_primitivefield(2); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_stringfield("foo"); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_enumfield(unittest::FOREIGN_FOO); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_messagefield()->set_c(6); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.add_repeatedprimitivefield(8); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.add_repeatedstringfield("qux"); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.add_repeatedenumfield(unittest::FOREIGN_BAR); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.add_repeatedmessagefield()->set_c(15); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, message.primitivefield()); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("foo", message.stringfield()); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::FOREIGN_FOO, message.enumfield()); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(6, message.messagefield().c()); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(8, message.repeatedprimitivefield(0)); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("qux", message.repeatedstringfield(0)); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::FOREIGN_BAR, message.repeatedenumfield(0)); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(15, message.repeatedmessagefield(0).c()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, TestConflictingSymbolNames) { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test_bad_identifiers.proto successfully compiled, then it works. The 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // following is just a token usage to insure that the code is, in fact, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being compiled and linked. 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protobuf_unittest::TestConflictingSymbolNames message; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_uint32(1); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, message.ByteSize()); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_friend_(5); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, message.friend_()); 7613d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 7623d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // Instantiate extension template functions to test conflicting template 7633d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // parameter names. 7643d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch typedef protobuf_unittest::TestConflictingSymbolNamesExtension ExtensionMessage; 7653d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.AddExtension(ExtensionMessage::repeated_int32_ext, 123); 7663d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch EXPECT_EQ(123, 7673d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch message.GetExtension(ExtensionMessage::repeated_int32_ext, 0)); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PROTOBUF_TEST_NO_DESCRIPTORS 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, TestOptimizedForSize) { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We rely on the tests in reflection_ops_unittest and wire_format_unittest 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to really test that reflection-based methods work. Here we are mostly 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just making sure that TestOptimizedForSize actually builds and seems to 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // function. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protobuf_unittest::TestOptimizedForSize message, message2; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_i(1); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_msg()->set_c(2); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.CopyFrom(message); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, message2.i()); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, message2.msg().c()); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, TestEmbedOptimizedForSize) { 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verifies that something optimized for speed can contain something optimized 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for size. 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protobuf_unittest::TestEmbedOptimizedForSize message, message2; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.mutable_optional_message()->set_i(1); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.add_repeated_message()->mutable_msg()->set_c(2); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string data; 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.SerializeToString(&data); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(message2.ParseFromString(data)); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, message2.optional_message().i()); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, message2.repeated_message(0).msg().c()); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, TestSpaceUsed) { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes message1; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sizeof provides a lower bound on SpaceUsed(). 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(sizeof(unittest::TestAllTypes), message1.SpaceUsed()); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int empty_message_size = message1.SpaceUsed(); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting primitive types shouldn't affect the space used. 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_int32(123); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_int64(12345); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_uint32(123); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_uint64(12345); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(empty_message_size, message1.SpaceUsed()); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On some STL implementations, setting the string to a small value should 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only increase SpaceUsed() by the size of a string object, though this is 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not true everywhere. 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_string("abc"); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(empty_message_size + sizeof(string), message1.SpaceUsed()); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting a string to a value larger than the string object itself should 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // increase SpaceUsed(), because it cannot store the value internally. 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.set_optional_string(string(sizeof(string) + 1, 'x')); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int min_expected_increase = message1.optional_string().capacity() + 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(string); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LE(empty_message_size + min_expected_increase, 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.SpaceUsed()); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int previous_size = message1.SpaceUsed(); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adding an optional message should increase the size by the size of the 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nested message type. NestedMessage is simple enough (1 int field) that it 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is equal to sizeof(NestedMessage) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.mutable_optional_nested_message(); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sizeof(unittest::TestAllTypes::NestedMessage), 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.optional_nested_message().SpaceUsed()); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(previous_size + 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(unittest::TestAllTypes::NestedMessage), 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.SpaceUsed()); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !PROTOBUF_TEST_NO_DESCRIPTORS 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, FieldConstantValues) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestRequired message; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes_NestedMessage::kBbFieldNumber, 1); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::kOptionalInt32FieldNumber, 1); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::kOptionalgroupFieldNumber, 16); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedMessageFieldNumber, 18); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedEnumFieldNumber, 21); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::kRepeatedInt32FieldNumber, 31); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::kRepeatedgroupFieldNumber, 46); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedMessageFieldNumber, 48); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedEnumFieldNumber, 51); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedMessageTest, ExtensionConstantValues) { 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestRequired::kSingleFieldNumber, 1000); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestRequired::kMultiFieldNumber, 1001); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::kOptionalInt32ExtensionFieldNumber, 1); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::kOptionalgroupExtensionFieldNumber, 16); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::kOptionalNestedMessageExtensionFieldNumber, 18); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::kOptionalNestedEnumExtensionFieldNumber, 21); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::kRepeatedInt32ExtensionFieldNumber, 31); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::kRepeatedgroupExtensionFieldNumber, 46); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::kRepeatedNestedMessageExtensionFieldNumber, 48); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::kRepeatedNestedEnumExtensionFieldNumber, 51); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// =================================================================== 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedEnumTest, EnumValuesAsSwitchCases) { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that our nested enum values can be used as switch cases. This test 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // doesn't actually do anything, the proof that it works is that it 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compiles. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i =0; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes::NestedEnum a = unittest::TestAllTypes::BAR; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (a) { 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case unittest::TestAllTypes::FOO: 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = 1; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case unittest::TestAllTypes::BAR: 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = 2; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case unittest::TestAllTypes::BAZ: 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = 3; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no default case: We want to make sure the compiler recognizes that 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all cases are covered. (GCC warns if you do not cover all cases of 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an enum in a switch.) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Token check just for fun. 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, i); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedEnumTest, IsValidValue) { 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test enum IsValidValue. 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(1)); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(2)); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(3)); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(0)); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(4)); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure it also works when there are dups. 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(1)); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(2)); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(3)); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(0)); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(4)); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedEnumTest, MinAndMax) { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::FOO, 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes::NestedEnum_MIN); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::BAZ, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestAllTypes::NestedEnum_MAX); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, unittest::TestAllTypes::NestedEnum_ARRAYSIZE); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::FOREIGN_FOO, unittest::ForeignEnum_MIN); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::FOREIGN_BAZ, unittest::ForeignEnum_MAX); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7, unittest::ForeignEnum_ARRAYSIZE); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, unittest::TestEnumWithDupValue_MIN); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, unittest::TestEnumWithDupValue_MAX); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, unittest::TestEnumWithDupValue_ARRAYSIZE); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::SPARSE_E, unittest::TestSparseEnum_MIN); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::SPARSE_C, unittest::TestSparseEnum_MAX); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(12589235, unittest::TestSparseEnum_ARRAYSIZE); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we can take the address of _MIN, _MAX and _ARRAYSIZE. 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* null_pointer = 0; // NULL may be integer-type, not pointer-type. 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MIN); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MAX); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_ARRAYSIZE); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(null_pointer, &unittest::ForeignEnum_MIN); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(null_pointer, &unittest::ForeignEnum_MAX); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(null_pointer, &unittest::ForeignEnum_ARRAYSIZE); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9423d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // Make sure we can use _MIN and _MAX as switch cases. 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (unittest::SPARSE_A) { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case unittest::TestSparseEnum_MIN: 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case unittest::TestSparseEnum_MAX: 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PROTOBUF_TEST_NO_DESCRIPTORS 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedEnumTest, Name) { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Names" in the presence of dup values are a bit arbitrary. 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO1)); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO2)); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("SPARSE_A", unittest::TestSparseEnum_Name(unittest::SPARSE_A)); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("SPARSE_B", unittest::TestSparseEnum_Name(unittest::SPARSE_B)); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("SPARSE_C", unittest::TestSparseEnum_Name(unittest::SPARSE_C)); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("SPARSE_D", unittest::TestSparseEnum_Name(unittest::SPARSE_D)); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("SPARSE_E", unittest::TestSparseEnum_Name(unittest::SPARSE_E)); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("SPARSE_F", unittest::TestSparseEnum_Name(unittest::SPARSE_F)); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("SPARSE_G", unittest::TestSparseEnum_Name(unittest::SPARSE_G)); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedEnumTest, Parse) { 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestEnumWithDupValue dup_value = unittest::FOO1; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO1", &dup_value)); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::FOO1, dup_value); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO2", &dup_value)); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::FOO2, dup_value); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(unittest::TestEnumWithDupValue_Parse("FOO", &dup_value)); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(GeneratedEnumTest, GetEnumDescriptor) { 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestAllTypes::NestedEnum_descriptor(), 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetEnumDescriptor<unittest::TestAllTypes::NestedEnum>()); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::ForeignEnum_descriptor(), 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetEnumDescriptor<unittest::ForeignEnum>()); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestEnumWithDupValue_descriptor(), 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetEnumDescriptor<unittest::TestEnumWithDupValue>()); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(unittest::TestSparseEnum_descriptor(), 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetEnumDescriptor<unittest::TestSparseEnum>()); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PROTOBUF_TEST_NO_DESCRIPTORS 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// =================================================================== 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PROTOBUF_TEST_NO_DESCRIPTORS 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Support code for testing services. 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GeneratedServiceTest : public testing::Test { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockTestService : public unittest::TestService { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockTestService() 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : called_(false), 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_(""), 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_(NULL), 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_(NULL), 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_(NULL), 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_(NULL) {} 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockTestService() {} 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { called_ = false; } 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implements TestService ---------------------------------------- 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Foo(RpcController* controller, 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::FooRequest* request, 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::FooResponse* response, 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* done) { 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(called_); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called_ = true; 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_ = "Foo"; 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_ = controller; 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_ = request; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_ = response; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_ = done; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Bar(RpcController* controller, 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::BarRequest* request, 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::BarResponse* response, 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* done) { 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(called_); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called_ = true; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_ = "Bar"; 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_ = controller; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_ = request; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_ = response; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_ = done; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // --------------------------------------------------------------- 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool called_; 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string method_; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RpcController* controller_; 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* request_; 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Message* response_; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* done_; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockRpcChannel : public RpcChannel { 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRpcChannel() 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : called_(false), 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_(NULL), 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_(NULL), 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_(NULL), 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_(NULL), 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_(NULL), 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroyed_(NULL) {} 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockRpcChannel() { 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (destroyed_ != NULL) *destroyed_ = true; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { called_ = false; } 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implements TestService ---------------------------------------- 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallMethod(const MethodDescriptor* method, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RpcController* controller, 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* request, 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Message* response, 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* done) { 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(called_); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called_ = true; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) method_ = method; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller_ = controller; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_ = request; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) response_ = response; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_ = done; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // --------------------------------------------------------------- 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool called_; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MethodDescriptor* method_; 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RpcController* controller_; 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Message* request_; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Message* response_; 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* done_; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* destroyed_; 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockController : public RpcController { 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Reset() not expected during this test."; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Failed() const { 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Failed() not expected during this test."; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string ErrorText() const { 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "ErrorText() not expected during this test."; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ""; 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartCancel() { 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "StartCancel() not expected during this test."; 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetFailed(const string& reason) { 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "SetFailed() not expected during this test."; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsCanceled() const { 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "IsCanceled() not expected during this test."; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyOnCancel(Closure* callback) { 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "NotifyOnCancel() not expected during this test."; 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GeneratedServiceTest() 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : descriptor_(unittest::TestService::descriptor()), 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo_(descriptor_->FindMethodByName("Foo")), 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bar_(descriptor_->FindMethodByName("Bar")), 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stub_(&mock_channel_), 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_(NewPermanentCallback(&DoNothing)) {} 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(foo_ != NULL); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(bar_ != NULL); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ServiceDescriptor* descriptor_; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MethodDescriptor* foo_; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MethodDescriptor* bar_; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockTestService mock_service_; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockController mock_controller_; 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRpcChannel mock_channel_; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestService::Stub stub_; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Just so we don't have to re-define these with every test. 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::FooRequest foo_request_; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::FooResponse foo_response_; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::BarRequest bar_request_; 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::BarResponse bar_response_; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Closure> done_; 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, GetDescriptor) { 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that GetDescriptor() works. 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(descriptor_, mock_service_.GetDescriptor()); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, GetChannel) { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&mock_channel_, stub_.channel()); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, OwnsChannel) { 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRpcChannel* channel = new MockRpcChannel; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool destroyed = false; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel->destroyed_ = &destroyed; 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest::TestService::Stub owning_stub(channel, 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Service::STUB_OWNS_CHANNEL); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(destroyed); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(destroyed); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, CallMethod) { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that CallMethod() works. 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call Foo() via CallMethod(). 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_service_.CallMethod(foo_, &mock_controller_, 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &foo_request_, &foo_response_, done_.get()); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mock_service_.called_); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Foo" , mock_service_.method_ ); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&mock_controller_, mock_service_.controller_); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&foo_request_ , mock_service_.request_ ); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&foo_response_ , mock_service_.response_ ); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(done_.get() , mock_service_.done_ ); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try again, but call Bar() instead. 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_service_.Reset(); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_service_.CallMethod(bar_, &mock_controller_, 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &bar_request_, &bar_response_, done_.get()); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mock_service_.called_); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Bar", mock_service_.method_); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, CallMethodTypeFailure) { 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify death if we call Foo() with Bar's message types. 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DEBUG_DEATH( 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_service_.CallMethod(foo_, &mock_controller_, 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &foo_request_, &bar_response_, done_.get()), 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dynamic_cast"); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_service_.Reset(); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_DEBUG_DEATH( 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_service_.CallMethod(foo_, &mock_controller_, 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &bar_request_, &foo_response_, done_.get()), 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "dynamic_cast"); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GTEST_HAS_DEATH_TEST 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, GetPrototypes) { 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test Get{Request,Response}Prototype() methods. 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&unittest::FooRequest::default_instance(), 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &mock_service_.GetRequestPrototype(foo_)); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&unittest::BarRequest::default_instance(), 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &mock_service_.GetRequestPrototype(bar_)); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&unittest::FooResponse::default_instance(), 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &mock_service_.GetResponsePrototype(foo_)); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&unittest::BarResponse::default_instance(), 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &mock_service_.GetResponsePrototype(bar_)); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, Stub) { 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that the stub class works. 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call Foo() via the stub. 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stub_.Foo(&mock_controller_, &foo_request_, &foo_response_, done_.get()); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mock_channel_.called_); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(foo_ , mock_channel_.method_ ); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&mock_controller_, mock_channel_.controller_); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&foo_request_ , mock_channel_.request_ ); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(&foo_response_ , mock_channel_.response_ ); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(done_.get() , mock_channel_.done_ ); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call Bar() via the stub. 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_channel_.Reset(); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stub_.Bar(&mock_controller_, &bar_request_, &bar_response_, done_.get()); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mock_channel_.called_); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bar_, mock_channel_.method_); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, NotImplemented) { 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that failing to implement a method of a service causes it to fail 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with a "not implemented" error message. 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A service which doesn't implement any methods. 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class UnimplementedService : public unittest::TestService { 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnimplementedService() {} 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnimplementedService unimplemented_service; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And a controller which expects to get a "not implemented" error. 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class ExpectUnimplementedController : public MockController { 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectUnimplementedController() : called_(false) {} 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetFailed(const string& reason) { 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(called_); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called_ = true; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Method Foo() not implemented.", reason); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool called_; 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectUnimplementedController controller; 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call Foo. 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unimplemented_service.Foo(&controller, &foo_request_, &foo_response_, 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done_.get()); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(controller.called_); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cpp_unittest 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cpp 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace compiler 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace no_generic_services_test { 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that no class called "TestService" was defined in 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unittest_no_generic_services.pb.h by defining a different type by the same 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name. If such a service was generated, this will not compile. 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestService { 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace compiler { 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cpp { 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cpp_unittest { 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GeneratedServiceTest, NoGenericServices) { 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that non-services in unittest_no_generic_services.proto were 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generated. 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) no_generic_services_test::TestMessage message; 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.set_a(1); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.SetExtension(no_generic_services_test::test_extension, 123); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) no_generic_services_test::TestEnum e = no_generic_services_test::FOO; 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(e, 1); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that a ServiceDescriptor is generated for the service even if the 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // class itself is not. 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileDescriptor* file = 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) no_generic_services_test::TestMessage::descriptor()->file(); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, file->service_count()); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("TestService", file->service(0)->name()); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, file->service(0)->method_count()); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Foo", file->service(0)->method(0)->name()); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !PROTOBUF_TEST_NO_DESCRIPTORS 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// =================================================================== 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test must run last. It verifies that descriptors were or were not 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initialized depending on whether PROTOBUF_TEST_NO_DESCRIPTORS was defined. 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When this is defined, we skip all tests which are expected to trigger 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// descriptor initialization. This verifies that everything else still works 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if descriptors are not initialized. 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DescriptorInitializationTest, Initialized) { 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PROTOBUF_TEST_NO_DESCRIPTORS 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_have_descriptors = false; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_have_descriptors = true; 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_have_descriptors, 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DescriptorPool::generated_pool()->InternalIsFileLoaded( 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "google/protobuf/unittest.proto")); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cpp_unittest 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cpp 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace compiler 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protobuf 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google 1351