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#ifndef GOOGLE_PROTOBUF_TEST_UTIL_H__ 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_TEST_UTIL_H__ 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <stack> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string> 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message.h> 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace unittest = protobuf_unittest; 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace unittest_import = protobuf_unittest_import; 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TestUtil { 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set every field in the message to a unique value. 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void SetAllFields(unittest::TestAllTypes* message); 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void SetAllExtensions(unittest::TestAllExtensions* message); 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void SetAllFieldsAndExtensions(unittest::TestFieldOrderings* message); 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void SetPackedFields(unittest::TestPackedTypes* message); 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void SetPackedExtensions(unittest::TestPackedExtensions* message); 57d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void SetUnpackedFields(unittest::TestUnpackedTypes* message); 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Use the repeated versions of the set_*() accessors to modify all the 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // repeated fields of the messsage (which should already have been 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // initialized with Set*Fields()). Set*Fields() itself only tests 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the add_*() accessors. 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ModifyRepeatedFields(unittest::TestAllTypes* message); 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ModifyRepeatedExtensions(unittest::TestAllExtensions* message); 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ModifyPackedFields(unittest::TestPackedTypes* message); 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ModifyPackedExtensions(unittest::TestPackedExtensions* message); 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that all fields have the values that they should have after 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set*Fields() is called. 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectAllFieldsSet(const unittest::TestAllTypes& message); 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectAllExtensionsSet( 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestAllExtensions& message); 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectPackedFieldsSet(const unittest::TestPackedTypes& message); 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectPackedExtensionsSet( 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestPackedExtensions& message); 76d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void ExpectUnpackedFieldsSet( 77d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const unittest::TestUnpackedTypes& message); 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Expect that the message is modified as would be expected from 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Modify*Fields(). 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectRepeatedFieldsModified( 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestAllTypes& message); 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectRepeatedExtensionsModified( 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestAllExtensions& message); 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectPackedFieldsModified( 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestPackedTypes& message); 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectPackedExtensionsModified( 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestPackedExtensions& message); 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that all fields have their default values. 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectClear(const unittest::TestAllTypes& message); 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectExtensionsClear(const unittest::TestAllExtensions& message); 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectPackedClear(const unittest::TestPackedTypes& message); 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectPackedExtensionsClear( 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestPackedExtensions& message); 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that the passed-in serialization is the canonical serialization we 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // expect for a TestFieldOrderings message filled in by 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // SetAllFieldsAndExtensions(). 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectAllFieldsAndExtensionsInOrder(const string& serialized); 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that all repeated fields have had their last elements removed. 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectLastRepeatedsRemoved( 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestAllTypes& message); 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectLastRepeatedExtensionsRemoved( 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestAllExtensions& message); 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that all repeated fields have had their first and last elements 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // swapped. 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectRepeatedsSwapped(const unittest::TestAllTypes& message); 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void ExpectRepeatedExtensionsSwapped( 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const unittest::TestAllExtensions& message); 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but use the reflection interface. 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class ReflectionTester { 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // base_descriptor must be a descriptor for TestAllTypes or 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TestAllExtensions. In the former case, ReflectionTester fetches from 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it the FieldDescriptors needed to use the reflection interface. In 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the latter case, ReflectionTester searches for extension fields in 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // its file. 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville explicit ReflectionTester(const Descriptor* base_descriptor); 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetAllFieldsViaReflection(Message* message); 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ModifyRepeatedFieldsViaReflection(Message* message); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectAllFieldsSetViaReflection(const Message& message); 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectClearViaReflection(const Message& message); 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetPackedFieldsViaReflection(Message* message); 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ModifyPackedFieldsViaReflection(Message* message); 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectPackedFieldsSetViaReflection(const Message& message); 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectPackedClearViaReflection(const Message& message); 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void RemoveLastRepeatedsViaReflection(Message* message); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SwapRepeatedsViaReflection(Message* message); 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* F(const string& name); 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* base_descriptor_; 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* group_a_; 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* repeated_group_a_; 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* nested_b_; 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* foreign_c_; 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* import_d_; 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* nested_foo_; 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* nested_bar_; 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* nested_baz_; 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foreign_foo_; 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foreign_bar_; 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* foreign_baz_; 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* import_foo_; 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* import_bar_; 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* import_baz_; 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We have to split this into three function otherwise it creates a stack 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // frame so large that it triggers a warning. 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectAllFieldsSetViaReflection1(const Message& message); 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectAllFieldsSetViaReflection2(const Message& message); 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectAllFieldsSetViaReflection3(const Message& message); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionTester); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtil); 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GOOGLE_PROTOBUF_TEST_UTIL_H__ 175