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)#ifndef GOOGLE_PROTOBUF_TEST_UTIL_H__ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GOOGLE_PROTOBUF_TEST_UTIL_H__ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stack> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/message.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/unittest.pb.h> 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace unittest = ::protobuf_unittest; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace unittest_import = protobuf_unittest_import; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestUtil { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set every field in the message to a unique value. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetAllFields(unittest::TestAllTypes* message); 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static void SetOptionalFields(unittest::TestAllTypes* message); 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static void AddRepeatedFields1(unittest::TestAllTypes* message); 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static void AddRepeatedFields2(unittest::TestAllTypes* message); 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static void SetDefaultFields(unittest::TestAllTypes* message); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetAllExtensions(unittest::TestAllExtensions* message); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetAllFieldsAndExtensions(unittest::TestFieldOrderings* message); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetPackedFields(unittest::TestPackedTypes* message); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetPackedExtensions(unittest::TestPackedExtensions* message); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetUnpackedFields(unittest::TestUnpackedTypes* message); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the repeated versions of the set_*() accessors to modify all the 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // repeated fields of the messsage (which should already have been 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized with Set*Fields()). Set*Fields() itself only tests 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the add_*() accessors. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ModifyRepeatedFields(unittest::TestAllTypes* message); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ModifyRepeatedExtensions(unittest::TestAllExtensions* message); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ModifyPackedFields(unittest::TestPackedTypes* message); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ModifyPackedExtensions(unittest::TestPackedExtensions* message); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that all fields have the values that they should have after 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set*Fields() is called. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectAllFieldsSet(const unittest::TestAllTypes& message); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectAllExtensionsSet( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestAllExtensions& message); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectPackedFieldsSet(const unittest::TestPackedTypes& message); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectPackedExtensionsSet( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestPackedExtensions& message); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectUnpackedFieldsSet( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestUnpackedTypes& message); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect that the message is modified as would be expected from 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modify*Fields(). 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectRepeatedFieldsModified( 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestAllTypes& message); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectRepeatedExtensionsModified( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestAllExtensions& message); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectPackedFieldsModified( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestPackedTypes& message); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectPackedExtensionsModified( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestPackedExtensions& message); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that all fields have their default values. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectClear(const unittest::TestAllTypes& message); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectExtensionsClear(const unittest::TestAllExtensions& message); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectPackedClear(const unittest::TestPackedTypes& message); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectPackedExtensionsClear( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestPackedExtensions& message); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the passed-in serialization is the canonical serialization we 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // expect for a TestFieldOrderings message filled in by 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetAllFieldsAndExtensions(). 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectAllFieldsAndExtensionsInOrder(const string& serialized); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that all repeated fields have had their last elements removed. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectLastRepeatedsRemoved( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestAllTypes& message); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectLastRepeatedExtensionsRemoved( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestAllExtensions& message); 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static void ExpectLastRepeatedsReleased( 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const unittest::TestAllTypes& message); 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static void ExpectLastRepeatedExtensionsReleased( 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const unittest::TestAllExtensions& message); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that all repeated fields have had their first and last elements 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // swapped. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectRepeatedsSwapped(const unittest::TestAllTypes& message); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ExpectRepeatedExtensionsSwapped( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unittest::TestAllExtensions& message); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like above, but use the reflection interface. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class ReflectionTester { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base_descriptor must be a descriptor for TestAllTypes or 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TestAllExtensions. In the former case, ReflectionTester fetches from 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it the FieldDescriptors needed to use the reflection interface. In 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the latter case, ReflectionTester searches for extension fields in 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its file. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ReflectionTester(const Descriptor* base_descriptor); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetAllFieldsViaReflection(Message* message); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ModifyRepeatedFieldsViaReflection(Message* message); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectAllFieldsSetViaReflection(const Message& message); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectClearViaReflection(const Message& message); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetPackedFieldsViaReflection(Message* message); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ModifyPackedFieldsViaReflection(Message* message); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectPackedFieldsSetViaReflection(const Message& message); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectPackedClearViaReflection(const Message& message); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveLastRepeatedsViaReflection(Message* message); 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void ReleaseLastRepeatedsViaReflection( 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Message* message, bool expect_extensions_notnull); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SwapRepeatedsViaReflection(Message* message); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch enum MessageReleaseState { 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IS_NULL, 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch CAN_BE_NULL, 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOT_NULL, 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch }; 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void ExpectMessagesReleasedViaReflection( 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Message* message, MessageReleaseState expected_release_state); 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldDescriptor* F(const string& name); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Descriptor* base_descriptor_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldDescriptor* group_a_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldDescriptor* repeated_group_a_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldDescriptor* nested_b_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldDescriptor* foreign_c_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FieldDescriptor* import_d_; 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FieldDescriptor* import_e_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* nested_foo_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* nested_bar_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* nested_baz_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* foreign_foo_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* foreign_bar_; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* foreign_baz_; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* import_foo_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* import_bar_; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnumValueDescriptor* import_baz_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have to split this into three function otherwise it creates a stack 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame so large that it triggers a warning. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectAllFieldsSetViaReflection1(const Message& message); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectAllFieldsSetViaReflection2(const Message& message); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectAllFieldsSetViaReflection3(const Message& message); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionTester); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtil); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protobuf 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GOOGLE_PROTOBUF_TEST_UTIL_H__ 194