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