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