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