generated_message_reflection_unittest.cc revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To test GeneratedMessageReflection, we actually let the protocol compiler 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// generate a full protocol message implementation and then test its 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// reflection interface. This is much easier and more maintainable than 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// trying to create our own Message class for GeneratedMessageReflection 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to wrap. 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The tests here closely mirror some of the tests in 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// compiler/cpp/unittest, except using the reflection interface 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// rather than generated accessors. 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/generated_message_reflection.h> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/test_util.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h> 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h> 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes. 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst FieldDescriptor* F(const string& name) { 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* result = 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()->FindFieldByName(name); 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK(result != NULL); 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Defaults) { 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that all default values are set correctly in the initial message. 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ExpectClearViaReflection(message); 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message.GetReflection(); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Messages should return pointers to default instances until first use. 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // (This is not checked by ExpectClear() since it is not actually true after 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the fields have been set and then cleared.) 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(), 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optionalgroup"))); 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_nested_message"))); 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&unittest::ForeignMessage::default_instance(), 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_foreign_message"))); 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_import_message"))); 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Accessors) { 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set every field to a unique value then go back and check all those 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // values. 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SetAllFieldsViaReflection(&message); 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message); 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ExpectAllFieldsSetViaReflection(message); 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ModifyRepeatedFieldsViaReflection(&message); 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedFieldsModified(message); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, GetStringReference) { 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that GetStringReference() returns the underlying string when it is 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a normal string field. 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.set_optional_string("foo"); 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string("foo"); 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message.GetReflection(); 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string scratch; 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&message.optional_string(), 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetStringReference(message, F("optional_string"), &scratch)) 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "For simple string fields, GetStringReference() should return a " 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "reference to the underlying string."; 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&message.repeated_string(0), 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetRepeatedStringReference(message, F("repeated_string"), 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 0, &scratch)) 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "For simple string fields, GetRepeatedStringReference() should return " 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "a reference to the underlying string."; 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, DefaultsAfterClear) { 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that after setting all fields and then clearing, getting an 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // embedded message does NOT return the default instance. 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.Clear(); 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message.GetReflection(); 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optionalgroup"))); 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_nested_message"))); 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&unittest::ForeignMessage::default_instance(), 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_foreign_message"))); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&unittest_import::ImportMessage::default_instance(), 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_import_message"))); 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Swap) { 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message1; 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message2; 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message1); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message1.GetReflection(); 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectClear(message1); 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message2); 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapWithBothSet) { 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message1; 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message2; 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message1); 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message2); 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ModifyRepeatedFields(&message2); 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message1.GetReflection(); 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedFieldsModified(message1); 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message2); 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.set_optional_int32(532819); 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(532819, message2.optional_int32()); 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapExtensions) { 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message1; 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message2; 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllExtensions(&message1); 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message1.GetReflection(); 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectExtensionsClear(message1); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllExtensionsSet(message2); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapUnknown) { 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestEmptyMessage message1, message2; 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.mutable_unknown_fields()->AddVarint(1234, 1); 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, message1.unknown_fields().field_count()); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, message2.unknown_fields().field_count()); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message1.GetReflection(); 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, message1.unknown_fields().field_count()); 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, message2.unknown_fields().field_count()); 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, RemoveLast) { 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message); 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.RemoveLastRepeatedsViaReflection(&message); 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectLastRepeatedsRemoved(message); 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, RemoveLastExtensions) { 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message; 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()); 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllExtensions(&message); 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.RemoveLastRepeatedsViaReflection(&message); 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectLastRepeatedExtensionsRemoved(message); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapRepeatedElements) { 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message); 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap and test that fields are all swapped. 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SwapRepeatedsViaReflection(&message); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedsSwapped(message); 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap back and test that fields are all back to original values. 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SwapRepeatedsViaReflection(&message); 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message); 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) { 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message; 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()); 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllExtensions(&message); 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap and test that fields are all swapped. 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SwapRepeatedsViaReflection(&message); 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedExtensionsSwapped(message); 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap back and test that fields are all back to original values. 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SwapRepeatedsViaReflection(&message); 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllExtensionsSet(message); 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Extensions) { 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set every extension to a unique value then go back and check all those 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // values. 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message; 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()); 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SetAllFieldsViaReflection(&message); 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllExtensionsSet(message); 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ExpectAllFieldsSetViaReflection(message); 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ModifyRepeatedFieldsViaReflection(&message); 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedExtensionsModified(message); 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) { 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::default_instance().GetReflection(); 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension1 = 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32_extension"); 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension2 = 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_string_extension"); 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension1, 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->FindKnownExtensionByNumber(extension1->number())); 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension2, 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->FindKnownExtensionByNumber(extension2->number())); 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-existent extension. 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) == NULL); 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Extensions of TestAllExtensions should not show up as extensions of 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // other types. 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()-> 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FindKnownExtensionByNumber(extension1->number()) == NULL); 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) { 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::default_instance().GetReflection(); 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension1 = 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32_extension"); 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension2 = 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_string_extension"); 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension1, 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->FindKnownExtensionByName(extension1->full_name())); 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension2, 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->FindKnownExtensionByName(extension2->full_name())); 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-existent extension. 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(reflection->FindKnownExtensionByName("no_such_ext") == NULL); 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Extensions of TestAllExtensions should not show up as extensions of 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // other types. 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()-> 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FindKnownExtensionByName(extension1->full_name()) == NULL); 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef GTEST_HAS_DEATH_TEST 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, UsageErrors) { 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message.GetReflection(); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* descriptor = message.GetDescriptor(); 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define f(NAME) descriptor->FindFieldByName(NAME) 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Testing every single failure mode would be too much work. Let's just 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // check a few. 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH( 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->GetInt32( 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message, descriptor->FindFieldByName("optional_int64")), 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffer reflection usage error:\n" 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::GetInt32\n" 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: protobuf_unittest\\.TestAllTypes\n" 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : protobuf_unittest\\.TestAllTypes\\.optional_int64\n" 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field is not the right type for this message:\n" 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Expected : CPPTYPE_INT32\n" 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field type: CPPTYPE_INT64"); 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH( 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->GetInt32( 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message, descriptor->FindFieldByName("repeated_int32")), 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffer reflection usage error:\n" 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::GetInt32\n" 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: protobuf_unittest.TestAllTypes\n" 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : protobuf_unittest.TestAllTypes.repeated_int32\n" 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field is repeated; the method requires a singular field."); 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH( 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->GetInt32( 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")), 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffer reflection usage error:\n" 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::GetInt32\n" 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: protobuf_unittest.TestAllTypes\n" 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : protobuf_unittest.ForeignMessage.c\n" 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field does not match message type."); 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH( 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->HasField( 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")), 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffer reflection usage error:\n" 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::HasField\n" 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: protobuf_unittest.TestAllTypes\n" 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : protobuf_unittest.ForeignMessage.c\n" 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field does not match message type."); 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef f 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GTEST_HAS_DEATH_TEST 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 385