generated_message_reflection_unittest.cc 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  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. // Author: kenton@google.com (Kenton Varda)
  31. // Based on original Protocol Buffers design by
  32. // Sanjay Ghemawat, Jeff Dean, and others.
  33. //
  34. // To test GeneratedMessageReflection, we actually let the protocol compiler
  35. // generate a full protocol message implementation and then test its
  36. // reflection interface. This is much easier and more maintainable than
  37. // trying to create our own Message class for GeneratedMessageReflection
  38. // to wrap.
  39. //
  40. // The tests here closely mirror some of the tests in
  41. // compiler/cpp/unittest, except using the reflection interface
  42. // rather than generated accessors.
  43. #include <google/protobuf/generated_message_reflection.h>
  44. #include <memory>
  45. #ifndef _SHARED_PTR_H
  46. #include <google/protobuf/stubs/shared_ptr.h>
  47. #endif
  48. #include <google/protobuf/test_util.h>
  49. #include <google/protobuf/unittest.pb.h>
  50. #include <google/protobuf/arena.h>
  51. #include <google/protobuf/descriptor.h>
  52. #include <google/protobuf/stubs/logging.h>
  53. #include <google/protobuf/stubs/common.h>
  54. #include <google/protobuf/testing/googletest.h>
  55. #include <gtest/gtest.h>
  56. namespace google {
  57. namespace protobuf {
  58. namespace {
  59. // Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.
  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. // Check that all default values are set correctly in the initial message.
  68. unittest::TestAllTypes message;
  69. TestUtil::ReflectionTester reflection_tester(
  70. unittest::TestAllTypes::descriptor());
  71. reflection_tester.ExpectClearViaReflection(message);
  72. const Reflection* reflection = message.GetReflection();
  73. // Messages should return pointers to default instances until first use.
  74. // (This is not checked by ExpectClear() since it is not actually true after
  75. // the fields have been set and then cleared.)
  76. EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(),
  77. &reflection->GetMessage(message, F("optionalgroup")));
  78. EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),
  79. &reflection->GetMessage(message, F("optional_nested_message")));
  80. EXPECT_EQ(&unittest::ForeignMessage::default_instance(),
  81. &reflection->GetMessage(message, F("optional_foreign_message")));
  82. EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),
  83. &reflection->GetMessage(message, F("optional_import_message")));
  84. }
  85. TEST(GeneratedMessageReflectionTest, Accessors) {
  86. // Set every field to a unique value then go back and check all those
  87. // values.
  88. unittest::TestAllTypes message;
  89. TestUtil::ReflectionTester reflection_tester(
  90. unittest::TestAllTypes::descriptor());
  91. reflection_tester.SetAllFieldsViaReflection(&message);
  92. TestUtil::ExpectAllFieldsSet(message);
  93. reflection_tester.ExpectAllFieldsSetViaReflection(message);
  94. reflection_tester.ModifyRepeatedFieldsViaReflection(&message);
  95. TestUtil::ExpectRepeatedFieldsModified(message);
  96. }
  97. TEST(GeneratedMessageReflectionTest, GetStringReference) {
  98. // Test that GetStringReference() returns the underlying string when it is
  99. // a normal string field.
  100. unittest::TestAllTypes message;
  101. message.set_optional_string("foo");
  102. message.add_repeated_string("foo");
  103. const Reflection* reflection = message.GetReflection();
  104. string scratch;
  105. EXPECT_EQ(&message.optional_string(),
  106. &reflection->GetStringReference(message, F("optional_string"), &scratch))
  107. << "For simple string fields, GetStringReference() should return a "
  108. "reference to the underlying string.";
  109. EXPECT_EQ(&message.repeated_string(0),
  110. &reflection->GetRepeatedStringReference(message, F("repeated_string"),
  111. 0, &scratch))
  112. << "For simple string fields, GetRepeatedStringReference() should return "
  113. "a reference to the underlying string.";
  114. }
  115. TEST(GeneratedMessageReflectionTest, DefaultsAfterClear) {
  116. // Check that after setting all fields and then clearing, getting an
  117. // embedded message does NOT return the default instance.
  118. unittest::TestAllTypes message;
  119. TestUtil::ReflectionTester reflection_tester(
  120. unittest::TestAllTypes::descriptor());
  121. TestUtil::SetAllFields(&message);
  122. message.Clear();
  123. const Reflection* reflection = message.GetReflection();
  124. EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),
  125. &reflection->GetMessage(message, F("optionalgroup")));
  126. EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
  127. &reflection->GetMessage(message, F("optional_nested_message")));
  128. EXPECT_NE(&unittest::ForeignMessage::default_instance(),
  129. &reflection->GetMessage(message, F("optional_foreign_message")));
  130. EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
  131. &reflection->GetMessage(message, F("optional_import_message")));
  132. }
  133. TEST(GeneratedMessageReflectionTest, Swap) {
  134. unittest::TestAllTypes message1;
  135. unittest::TestAllTypes message2;
  136. TestUtil::SetAllFields(&message1);
  137. const Reflection* reflection = message1.GetReflection();
  138. reflection->Swap(&message1, &message2);
  139. TestUtil::ExpectClear(message1);
  140. TestUtil::ExpectAllFieldsSet(message2);
  141. }
  142. TEST(GeneratedMessageReflectionTest, SwapWithBothSet) {
  143. unittest::TestAllTypes message1;
  144. unittest::TestAllTypes message2;
  145. TestUtil::SetAllFields(&message1);
  146. TestUtil::SetAllFields(&message2);
  147. TestUtil::ModifyRepeatedFields(&message2);
  148. const Reflection* reflection = message1.GetReflection();
  149. reflection->Swap(&message1, &message2);
  150. TestUtil::ExpectRepeatedFieldsModified(message1);
  151. TestUtil::ExpectAllFieldsSet(message2);
  152. message1.set_optional_int32(532819);
  153. reflection->Swap(&message1, &message2);
  154. EXPECT_EQ(532819, message2.optional_int32());
  155. }
  156. TEST(GeneratedMessageReflectionTest, SwapExtensions) {
  157. unittest::TestAllExtensions message1;
  158. unittest::TestAllExtensions message2;
  159. TestUtil::SetAllExtensions(&message1);
  160. const Reflection* reflection = message1.GetReflection();
  161. reflection->Swap(&message1, &message2);
  162. TestUtil::ExpectExtensionsClear(message1);
  163. TestUtil::ExpectAllExtensionsSet(message2);
  164. }
  165. TEST(GeneratedMessageReflectionTest, SwapUnknown) {
  166. unittest::TestEmptyMessage message1, message2;
  167. message1.mutable_unknown_fields()->AddVarint(1234, 1);
  168. EXPECT_EQ(1, message1.unknown_fields().field_count());
  169. EXPECT_EQ(0, message2.unknown_fields().field_count());
  170. const Reflection* reflection = message1.GetReflection();
  171. reflection->Swap(&message1, &message2);
  172. EXPECT_EQ(0, message1.unknown_fields().field_count());
  173. EXPECT_EQ(1, message2.unknown_fields().field_count());
  174. }
  175. TEST(GeneratedMessageReflectionTest, SwapFields) {
  176. unittest::TestAllTypes message1, message2;
  177. message1.set_optional_double(12.3);
  178. message1.mutable_repeated_int32()->Add(10);
  179. message1.mutable_repeated_int32()->Add(20);
  180. message2.set_optional_string("hello");
  181. message2.mutable_repeated_int64()->Add(30);
  182. std::vector<const FieldDescriptor*> fields;
  183. const Descriptor* descriptor = message1.GetDescriptor();
  184. fields.push_back(descriptor->FindFieldByName("optional_double"));
  185. fields.push_back(descriptor->FindFieldByName("repeated_int32"));
  186. fields.push_back(descriptor->FindFieldByName("optional_string"));
  187. fields.push_back(descriptor->FindFieldByName("optional_uint64"));
  188. const Reflection* reflection = message1.GetReflection();
  189. reflection->SwapFields(&message1, &message2, fields);
  190. EXPECT_FALSE(message1.has_optional_double());
  191. EXPECT_EQ(0, message1.repeated_int32_size());
  192. EXPECT_TRUE(message1.has_optional_string());
  193. EXPECT_EQ("hello", message1.optional_string());
  194. EXPECT_EQ(0, message1.repeated_int64_size());
  195. EXPECT_FALSE(message1.has_optional_uint64());
  196. EXPECT_TRUE(message2.has_optional_double());
  197. EXPECT_EQ(12.3, message2.optional_double());
  198. EXPECT_EQ(2, message2.repeated_int32_size());
  199. EXPECT_EQ(10, message2.repeated_int32(0));
  200. EXPECT_EQ(20, message2.repeated_int32(1));
  201. EXPECT_FALSE(message2.has_optional_string());
  202. EXPECT_EQ(1, message2.repeated_int64_size());
  203. EXPECT_FALSE(message2.has_optional_uint64());
  204. }
  205. TEST(GeneratedMessageReflectionTest, SwapFieldsAll) {
  206. unittest::TestAllTypes message1;
  207. unittest::TestAllTypes message2;
  208. TestUtil::SetAllFields(&message2);
  209. std::vector<const FieldDescriptor*> fields;
  210. const Reflection* reflection = message1.GetReflection();
  211. reflection->ListFields(message2, &fields);
  212. reflection->SwapFields(&message1, &message2, fields);
  213. TestUtil::ExpectAllFieldsSet(message1);
  214. TestUtil::ExpectClear(message2);
  215. }
  216. TEST(GeneratedMessageReflectionTest, SwapFieldsAllExtension) {
  217. unittest::TestAllExtensions message1;
  218. unittest::TestAllExtensions message2;
  219. TestUtil::SetAllExtensions(&message1);
  220. std::vector<const FieldDescriptor*> fields;
  221. const Reflection* reflection = message1.GetReflection();
  222. reflection->ListFields(message1, &fields);
  223. reflection->SwapFields(&message1, &message2, fields);
  224. TestUtil::ExpectExtensionsClear(message1);
  225. TestUtil::ExpectAllExtensionsSet(message2);
  226. }
  227. TEST(GeneratedMessageReflectionTest, SwapOneof) {
  228. unittest::TestOneof2 message1, message2;
  229. TestUtil::SetOneof1(&message1);
  230. const Reflection* reflection = message1.GetReflection();
  231. reflection->Swap(&message1, &message2);
  232. TestUtil::ExpectOneofClear(message1);
  233. TestUtil::ExpectOneofSet1(message2);
  234. }
  235. TEST(GeneratedMessageReflectionTest, SwapOneofBothSet) {
  236. unittest::TestOneof2 message1, message2;
  237. TestUtil::SetOneof1(&message1);
  238. TestUtil::SetOneof2(&message2);
  239. const Reflection* reflection = message1.GetReflection();
  240. reflection->Swap(&message1, &message2);
  241. TestUtil::ExpectOneofSet2(message1);
  242. TestUtil::ExpectOneofSet1(message2);
  243. }
  244. TEST(GeneratedMessageReflectionTest, SwapFieldsOneof) {
  245. unittest::TestOneof2 message1, message2;
  246. TestUtil::SetOneof1(&message1);
  247. std::vector<const FieldDescriptor*> fields;
  248. const Descriptor* descriptor = message1.GetDescriptor();
  249. for (int i = 0; i < descriptor->field_count(); i++) {
  250. fields.push_back(descriptor->field(i));
  251. }
  252. const Reflection* reflection = message1.GetReflection();
  253. reflection->SwapFields(&message1, &message2, fields);
  254. TestUtil::ExpectOneofClear(message1);
  255. TestUtil::ExpectOneofSet1(message2);
  256. }
  257. TEST(GeneratedMessageReflectionTest, RemoveLast) {
  258. unittest::TestAllTypes message;
  259. TestUtil::ReflectionTester reflection_tester(
  260. unittest::TestAllTypes::descriptor());
  261. TestUtil::SetAllFields(&message);
  262. reflection_tester.RemoveLastRepeatedsViaReflection(&message);
  263. TestUtil::ExpectLastRepeatedsRemoved(message);
  264. }
  265. TEST(GeneratedMessageReflectionTest, RemoveLastExtensions) {
  266. unittest::TestAllExtensions message;
  267. TestUtil::ReflectionTester reflection_tester(
  268. unittest::TestAllExtensions::descriptor());
  269. TestUtil::SetAllExtensions(&message);
  270. reflection_tester.RemoveLastRepeatedsViaReflection(&message);
  271. TestUtil::ExpectLastRepeatedExtensionsRemoved(message);
  272. }
  273. TEST(GeneratedMessageReflectionTest, ReleaseLast) {
  274. unittest::TestAllTypes message;
  275. const Descriptor* descriptor = message.GetDescriptor();
  276. TestUtil::ReflectionTester reflection_tester(descriptor);
  277. TestUtil::SetAllFields(&message);
  278. reflection_tester.ReleaseLastRepeatedsViaReflection(&message, false);
  279. TestUtil::ExpectLastRepeatedsReleased(message);
  280. // Now test that we actually release the right message.
  281. message.Clear();
  282. TestUtil::SetAllFields(&message);
  283. ASSERT_EQ(2, message.repeated_foreign_message_size());
  284. const protobuf_unittest::ForeignMessage* expected =
  285. message.mutable_repeated_foreign_message(1);
  286. google::protobuf::scoped_ptr<Message> released(message.GetReflection()->ReleaseLast(
  287. &message, descriptor->FindFieldByName("repeated_foreign_message")));
  288. EXPECT_EQ(expected, released.get());
  289. }
  290. TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) {
  291. unittest::TestAllExtensions message;
  292. const Descriptor* descriptor = message.GetDescriptor();
  293. TestUtil::ReflectionTester reflection_tester(descriptor);
  294. TestUtil::SetAllExtensions(&message);
  295. reflection_tester.ReleaseLastRepeatedsViaReflection(&message, true);
  296. TestUtil::ExpectLastRepeatedExtensionsReleased(message);
  297. // Now test that we actually release the right message.
  298. message.Clear();
  299. TestUtil::SetAllExtensions(&message);
  300. ASSERT_EQ(2, message.ExtensionSize(
  301. unittest::repeated_foreign_message_extension));
  302. const protobuf_unittest::ForeignMessage* expected = message.MutableExtension(
  303. unittest::repeated_foreign_message_extension, 1);
  304. google::protobuf::scoped_ptr<Message> released(message.GetReflection()->ReleaseLast(
  305. &message, descriptor->file()->FindExtensionByName(
  306. "repeated_foreign_message_extension")));
  307. EXPECT_EQ(expected, released.get());
  308. }
  309. TEST(GeneratedMessageReflectionTest, SwapRepeatedElements) {
  310. unittest::TestAllTypes message;
  311. TestUtil::ReflectionTester reflection_tester(
  312. unittest::TestAllTypes::descriptor());
  313. TestUtil::SetAllFields(&message);
  314. // Swap and test that fields are all swapped.
  315. reflection_tester.SwapRepeatedsViaReflection(&message);
  316. TestUtil::ExpectRepeatedsSwapped(message);
  317. // Swap back and test that fields are all back to original values.
  318. reflection_tester.SwapRepeatedsViaReflection(&message);
  319. TestUtil::ExpectAllFieldsSet(message);
  320. }
  321. TEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) {
  322. unittest::TestAllExtensions message;
  323. TestUtil::ReflectionTester reflection_tester(
  324. unittest::TestAllExtensions::descriptor());
  325. TestUtil::SetAllExtensions(&message);
  326. // Swap and test that fields are all swapped.
  327. reflection_tester.SwapRepeatedsViaReflection(&message);
  328. TestUtil::ExpectRepeatedExtensionsSwapped(message);
  329. // Swap back and test that fields are all back to original values.
  330. reflection_tester.SwapRepeatedsViaReflection(&message);
  331. TestUtil::ExpectAllExtensionsSet(message);
  332. }
  333. TEST(GeneratedMessageReflectionTest, Extensions) {
  334. // Set every extension to a unique value then go back and check all those
  335. // values.
  336. unittest::TestAllExtensions message;
  337. TestUtil::ReflectionTester reflection_tester(
  338. unittest::TestAllExtensions::descriptor());
  339. reflection_tester.SetAllFieldsViaReflection(&message);
  340. TestUtil::ExpectAllExtensionsSet(message);
  341. reflection_tester.ExpectAllFieldsSetViaReflection(message);
  342. reflection_tester.ModifyRepeatedFieldsViaReflection(&message);
  343. TestUtil::ExpectRepeatedExtensionsModified(message);
  344. }
  345. TEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) {
  346. const Reflection* reflection =
  347. unittest::TestAllExtensions::default_instance().GetReflection();
  348. const FieldDescriptor* extension1 =
  349. unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
  350. "optional_int32_extension");
  351. const FieldDescriptor* extension2 =
  352. unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
  353. "repeated_string_extension");
  354. EXPECT_EQ(extension1,
  355. reflection->FindKnownExtensionByNumber(extension1->number()));
  356. EXPECT_EQ(extension2,
  357. reflection->FindKnownExtensionByNumber(extension2->number()));
  358. // Non-existent extension.
  359. EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) == NULL);
  360. // Extensions of TestAllExtensions should not show up as extensions of
  361. // other types.
  362. EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->
  363. FindKnownExtensionByNumber(extension1->number()) == NULL);
  364. }
  365. TEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) {
  366. const Reflection* reflection =
  367. unittest::TestAllExtensions::default_instance().GetReflection();
  368. const FieldDescriptor* extension1 =
  369. unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
  370. "optional_int32_extension");
  371. const FieldDescriptor* extension2 =
  372. unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
  373. "repeated_string_extension");
  374. EXPECT_EQ(extension1,
  375. reflection->FindKnownExtensionByName(extension1->full_name()));
  376. EXPECT_EQ(extension2,
  377. reflection->FindKnownExtensionByName(extension2->full_name()));
  378. // Non-existent extension.
  379. EXPECT_TRUE(reflection->FindKnownExtensionByName("no_such_ext") == NULL);
  380. // Extensions of TestAllExtensions should not show up as extensions of
  381. // other types.
  382. EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->
  383. FindKnownExtensionByName(extension1->full_name()) == NULL);
  384. }
  385. TEST(GeneratedMessageReflectionTest, SetAllocatedMessageTest) {
  386. unittest::TestAllTypes from_message1;
  387. unittest::TestAllTypes from_message2;
  388. unittest::TestAllTypes to_message;
  389. TestUtil::ReflectionTester reflection_tester(
  390. unittest::TestAllTypes::descriptor());
  391. reflection_tester.SetAllFieldsViaReflection(&from_message1);
  392. reflection_tester.SetAllFieldsViaReflection(&from_message2);
  393. // Before moving fields, we expect the nested messages to be NULL.
  394. reflection_tester.ExpectMessagesReleasedViaReflection(
  395. &to_message, TestUtil::ReflectionTester::IS_NULL);
  396. // After fields are moved we should get non-NULL releases.
  397. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  398. &from_message1, &to_message);
  399. reflection_tester.ExpectMessagesReleasedViaReflection(
  400. &to_message, TestUtil::ReflectionTester::NOT_NULL);
  401. // Another move to make sure that we can SetAllocated several times.
  402. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  403. &from_message2, &to_message);
  404. reflection_tester.ExpectMessagesReleasedViaReflection(
  405. &to_message, TestUtil::ReflectionTester::NOT_NULL);
  406. // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
  407. // releases to be NULL again.
  408. reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
  409. &to_message);
  410. reflection_tester.ExpectMessagesReleasedViaReflection(
  411. &to_message, TestUtil::ReflectionTester::IS_NULL);
  412. }
  413. TEST(GeneratedMessageReflectionTest, SetAllocatedMessageOnArenaTest) {
  414. unittest::TestAllTypes from_message1;
  415. unittest::TestAllTypes from_message2;
  416. ::google::protobuf::Arena arena;
  417. unittest::TestAllTypes* to_message =
  418. ::google::protobuf::Arena::CreateMessage<unittest::TestAllTypes>(&arena);
  419. TestUtil::ReflectionTester reflection_tester(
  420. unittest::TestAllTypes::descriptor());
  421. reflection_tester.SetAllFieldsViaReflection(&from_message1);
  422. reflection_tester.SetAllFieldsViaReflection(&from_message2);
  423. // Before moving fields, we expect the nested messages to be NULL.
  424. reflection_tester.ExpectMessagesReleasedViaReflection(
  425. to_message, TestUtil::ReflectionTester::IS_NULL);
  426. // After fields are moved we should get non-NULL releases.
  427. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  428. &from_message1, to_message);
  429. reflection_tester.ExpectMessagesReleasedViaReflection(
  430. to_message, TestUtil::ReflectionTester::NOT_NULL);
  431. // Another move to make sure that we can SetAllocated several times.
  432. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  433. &from_message2, to_message);
  434. reflection_tester.ExpectMessagesReleasedViaReflection(
  435. to_message, TestUtil::ReflectionTester::NOT_NULL);
  436. // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
  437. // releases to be NULL again.
  438. reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
  439. to_message);
  440. reflection_tester.ExpectMessagesReleasedViaReflection(
  441. to_message, TestUtil::ReflectionTester::IS_NULL);
  442. }
  443. TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageTest) {
  444. unittest::TestAllExtensions from_message1;
  445. unittest::TestAllExtensions from_message2;
  446. unittest::TestAllExtensions to_message;
  447. TestUtil::ReflectionTester reflection_tester(
  448. unittest::TestAllExtensions::descriptor());
  449. reflection_tester.SetAllFieldsViaReflection(&from_message1);
  450. reflection_tester.SetAllFieldsViaReflection(&from_message2);
  451. // Before moving fields, we expect the nested messages to be NULL.
  452. reflection_tester.ExpectMessagesReleasedViaReflection(
  453. &to_message, TestUtil::ReflectionTester::IS_NULL);
  454. // After fields are moved we should get non-NULL releases.
  455. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  456. &from_message1, &to_message);
  457. reflection_tester.ExpectMessagesReleasedViaReflection(
  458. &to_message, TestUtil::ReflectionTester::NOT_NULL);
  459. // Another move to make sure that we can SetAllocated several times.
  460. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  461. &from_message2, &to_message);
  462. reflection_tester.ExpectMessagesReleasedViaReflection(
  463. &to_message, TestUtil::ReflectionTester::NOT_NULL);
  464. // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
  465. // releases to be NULL again.
  466. reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
  467. &to_message);
  468. reflection_tester.ExpectMessagesReleasedViaReflection(
  469. &to_message, TestUtil::ReflectionTester::IS_NULL);
  470. }
  471. TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageOnArenaTest) {
  472. ::google::protobuf::Arena arena;
  473. unittest::TestAllExtensions* to_message =
  474. ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
  475. unittest::TestAllExtensions from_message1;
  476. unittest::TestAllExtensions from_message2;
  477. TestUtil::ReflectionTester reflection_tester(
  478. unittest::TestAllExtensions::descriptor());
  479. reflection_tester.SetAllFieldsViaReflection(&from_message1);
  480. reflection_tester.SetAllFieldsViaReflection(&from_message2);
  481. // Before moving fields, we expect the nested messages to be NULL.
  482. reflection_tester.ExpectMessagesReleasedViaReflection(
  483. to_message, TestUtil::ReflectionTester::IS_NULL);
  484. // After fields are moved we should get non-NULL releases.
  485. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  486. &from_message1, to_message);
  487. reflection_tester.ExpectMessagesReleasedViaReflection(
  488. to_message, TestUtil::ReflectionTester::NOT_NULL);
  489. // Another move to make sure that we can SetAllocated several times.
  490. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  491. &from_message2, to_message);
  492. reflection_tester.ExpectMessagesReleasedViaReflection(
  493. to_message, TestUtil::ReflectionTester::NOT_NULL);
  494. // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the
  495. // releases to be NULL again.
  496. reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
  497. to_message);
  498. reflection_tester.ExpectMessagesReleasedViaReflection(
  499. to_message, TestUtil::ReflectionTester::IS_NULL);
  500. }
  501. TEST(GeneratedMessageReflectionTest, AddRepeatedMessage) {
  502. unittest::TestAllTypes message;
  503. const Reflection* reflection = message.GetReflection();
  504. const Reflection* nested_reflection =
  505. unittest::TestAllTypes::NestedMessage::default_instance().GetReflection();
  506. const FieldDescriptor* nested_bb =
  507. unittest::TestAllTypes::NestedMessage::descriptor()->FindFieldByName(
  508. "bb");
  509. Message* nested = reflection->AddMessage(
  510. &message, F("repeated_nested_message"));
  511. nested_reflection->SetInt32(nested, nested_bb, 11);
  512. EXPECT_EQ(11, message.repeated_nested_message(0).bb());
  513. }
  514. TEST(GeneratedMessageReflectionTest, MutableRepeatedMessage) {
  515. unittest::TestAllTypes message;
  516. const Reflection* reflection = message.GetReflection();
  517. const Reflection* nested_reflection =
  518. unittest::TestAllTypes::NestedMessage::default_instance().GetReflection();
  519. const FieldDescriptor* nested_bb =
  520. unittest::TestAllTypes::NestedMessage::descriptor()->FindFieldByName(
  521. "bb");
  522. message.add_repeated_nested_message()->set_bb(12);
  523. Message* nested = reflection->MutableRepeatedMessage(
  524. &message, F("repeated_nested_message"), 0);
  525. EXPECT_EQ(12, nested_reflection->GetInt32(*nested, nested_bb));
  526. nested_reflection->SetInt32(nested, nested_bb, 13);
  527. EXPECT_EQ(13, message.repeated_nested_message(0).bb());
  528. }
  529. TEST(GeneratedMessageReflectionTest, AddAllocatedMessage) {
  530. unittest::TestAllTypes message;
  531. const Reflection* reflection = message.GetReflection();
  532. unittest::TestAllTypes::NestedMessage* nested =
  533. new unittest::TestAllTypes::NestedMessage();
  534. nested->set_bb(11);
  535. reflection->AddAllocatedMessage(&message, F("repeated_nested_message"), nested);
  536. EXPECT_EQ(1, message.repeated_nested_message_size());
  537. EXPECT_EQ(11, message.repeated_nested_message(0).bb());
  538. }
  539. TEST(GeneratedMessageReflectionTest, ListFieldsOneOf) {
  540. unittest::TestOneof2 message;
  541. TestUtil::SetOneof1(&message);
  542. const Reflection* reflection = message.GetReflection();
  543. std::vector<const FieldDescriptor*> fields;
  544. reflection->ListFields(message, &fields);
  545. EXPECT_EQ(4, fields.size());
  546. }
  547. TEST(GeneratedMessageReflectionTest, Oneof) {
  548. unittest::TestOneof2 message;
  549. const Descriptor* descriptor = message.GetDescriptor();
  550. const Reflection* reflection = message.GetReflection();
  551. // Check default values.
  552. EXPECT_EQ(0, reflection->GetInt32(
  553. message, descriptor->FindFieldByName("foo_int")));
  554. EXPECT_EQ("", reflection->GetString(
  555. message, descriptor->FindFieldByName("foo_string")));
  556. EXPECT_EQ("", reflection->GetString(
  557. message, descriptor->FindFieldByName("foo_cord")));
  558. EXPECT_EQ("", reflection->GetString(
  559. message, descriptor->FindFieldByName("foo_string_piece")));
  560. EXPECT_EQ("", reflection->GetString(
  561. message, descriptor->FindFieldByName("foo_bytes")));
  562. EXPECT_EQ(unittest::TestOneof2::FOO, reflection->GetEnum(
  563. message, descriptor->FindFieldByName("foo_enum"))->number());
  564. EXPECT_EQ(&unittest::TestOneof2::NestedMessage::default_instance(),
  565. &reflection->GetMessage(
  566. message, descriptor->FindFieldByName("foo_message")));
  567. EXPECT_EQ(&unittest::TestOneof2::FooGroup::default_instance(),
  568. &reflection->GetMessage(
  569. message, descriptor->FindFieldByName("foogroup")));
  570. EXPECT_NE(&unittest::TestOneof2::FooGroup::default_instance(),
  571. &reflection->GetMessage(
  572. message, descriptor->FindFieldByName("foo_lazy_message")));
  573. EXPECT_EQ(5, reflection->GetInt32(
  574. message, descriptor->FindFieldByName("bar_int")));
  575. EXPECT_EQ("STRING", reflection->GetString(
  576. message, descriptor->FindFieldByName("bar_string")));
  577. EXPECT_EQ("CORD", reflection->GetString(
  578. message, descriptor->FindFieldByName("bar_cord")));
  579. EXPECT_EQ("SPIECE", reflection->GetString(
  580. message, descriptor->FindFieldByName("bar_string_piece")));
  581. EXPECT_EQ("BYTES", reflection->GetString(
  582. message, descriptor->FindFieldByName("bar_bytes")));
  583. EXPECT_EQ(unittest::TestOneof2::BAR, reflection->GetEnum(
  584. message, descriptor->FindFieldByName("bar_enum"))->number());
  585. // Check Set functions.
  586. reflection->SetInt32(
  587. &message, descriptor->FindFieldByName("foo_int"), 123);
  588. EXPECT_EQ(123, reflection->GetInt32(
  589. message, descriptor->FindFieldByName("foo_int")));
  590. reflection->SetString(
  591. &message, descriptor->FindFieldByName("foo_string"), "abc");
  592. EXPECT_EQ("abc", reflection->GetString(
  593. message, descriptor->FindFieldByName("foo_string")));
  594. reflection->SetString(
  595. &message, descriptor->FindFieldByName("foo_bytes"), "bytes");
  596. EXPECT_EQ("bytes", reflection->GetString(
  597. message, descriptor->FindFieldByName("foo_bytes")));
  598. reflection->SetString(
  599. &message, descriptor->FindFieldByName("bar_cord"), "change_cord");
  600. EXPECT_EQ("change_cord", reflection->GetString(
  601. message, descriptor->FindFieldByName("bar_cord")));
  602. reflection->SetString(
  603. &message, descriptor->FindFieldByName("bar_string_piece"),
  604. "change_spiece");
  605. EXPECT_EQ("change_spiece", reflection->GetString(
  606. message, descriptor->FindFieldByName("bar_string_piece")));
  607. }
  608. TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) {
  609. unittest::TestOneof2 from_message1;
  610. unittest::TestOneof2 from_message2;
  611. unittest::TestOneof2 to_message;
  612. const Descriptor* descriptor = unittest::TestOneof2::descriptor();
  613. const Reflection* reflection = to_message.GetReflection();
  614. Message* released = reflection->ReleaseMessage(
  615. &to_message, descriptor->FindFieldByName("foo_lazy_message"));
  616. EXPECT_TRUE(released == NULL);
  617. released = reflection->ReleaseMessage(
  618. &to_message, descriptor->FindFieldByName("foo_message"));
  619. EXPECT_TRUE(released == NULL);
  620. TestUtil::ReflectionTester::SetOneofViaReflection(&from_message1);
  621. TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1);
  622. TestUtil::ReflectionTester::
  623. SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  624. &from_message1, &to_message);
  625. const Message& sub_message = reflection->GetMessage(
  626. to_message, descriptor->FindFieldByName("foo_lazy_message"));
  627. released = reflection->ReleaseMessage(
  628. &to_message, descriptor->FindFieldByName("foo_lazy_message"));
  629. EXPECT_TRUE(released != NULL);
  630. EXPECT_EQ(&sub_message, released);
  631. delete released;
  632. TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2);
  633. reflection->MutableMessage(
  634. &from_message2, descriptor->FindFieldByName("foo_message"));
  635. TestUtil::ReflectionTester::
  636. SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  637. &from_message2, &to_message);
  638. const Message& sub_message2 = reflection->GetMessage(
  639. to_message, descriptor->FindFieldByName("foo_message"));
  640. released = reflection->ReleaseMessage(
  641. &to_message, descriptor->FindFieldByName("foo_message"));
  642. EXPECT_TRUE(released != NULL);
  643. EXPECT_EQ(&sub_message2, released);
  644. delete released;
  645. }
  646. TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageOnArenaTest) {
  647. unittest::TestOneof2 from_message1;
  648. unittest::TestOneof2 from_message2;
  649. ::google::protobuf::Arena arena;
  650. unittest::TestOneof2* to_message =
  651. ::google::protobuf::Arena::CreateMessage<unittest::TestOneof2>(&arena);
  652. const Descriptor* descriptor = unittest::TestOneof2::descriptor();
  653. const Reflection* reflection = to_message->GetReflection();
  654. Message* released = reflection->ReleaseMessage(
  655. to_message, descriptor->FindFieldByName("foo_lazy_message"));
  656. EXPECT_TRUE(released == NULL);
  657. released = reflection->ReleaseMessage(
  658. to_message, descriptor->FindFieldByName("foo_message"));
  659. EXPECT_TRUE(released == NULL);
  660. TestUtil::ReflectionTester::SetOneofViaReflection(&from_message1);
  661. TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1);
  662. TestUtil::ReflectionTester::
  663. SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  664. &from_message1, to_message);
  665. const Message& sub_message = reflection->GetMessage(
  666. *to_message, descriptor->FindFieldByName("foo_lazy_message"));
  667. released = reflection->ReleaseMessage(
  668. to_message, descriptor->FindFieldByName("foo_lazy_message"));
  669. EXPECT_TRUE(released != NULL);
  670. // Since sub_message is arena allocated, releasing it results in copying it
  671. // into new heap-allocated memory.
  672. EXPECT_NE(&sub_message, released);
  673. delete released;
  674. TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2);
  675. reflection->MutableMessage(
  676. &from_message2, descriptor->FindFieldByName("foo_message"));
  677. TestUtil::ReflectionTester::
  678. SetAllocatedOptionalMessageFieldsToMessageViaReflection(
  679. &from_message2, to_message);
  680. const Message& sub_message2 = reflection->GetMessage(
  681. *to_message, descriptor->FindFieldByName("foo_message"));
  682. released = reflection->ReleaseMessage(
  683. to_message, descriptor->FindFieldByName("foo_message"));
  684. EXPECT_TRUE(released != NULL);
  685. // Since sub_message2 is arena allocated, releasing it results in copying it
  686. // into new heap-allocated memory.
  687. EXPECT_NE(&sub_message2, released);
  688. delete released;
  689. }
  690. TEST(GeneratedMessageReflectionTest, ReleaseMessageTest) {
  691. unittest::TestAllTypes message;
  692. TestUtil::ReflectionTester reflection_tester(
  693. unittest::TestAllTypes::descriptor());
  694. // When nothing is set, we expect all released messages to be NULL.
  695. reflection_tester.ExpectMessagesReleasedViaReflection(
  696. &message, TestUtil::ReflectionTester::IS_NULL);
  697. // After fields are set we should get non-NULL releases.
  698. reflection_tester.SetAllFieldsViaReflection(&message);
  699. reflection_tester.ExpectMessagesReleasedViaReflection(
  700. &message, TestUtil::ReflectionTester::NOT_NULL);
  701. // After Clear() we may or may not get a message from ReleaseMessage().
  702. // This is implementation specific.
  703. reflection_tester.SetAllFieldsViaReflection(&message);
  704. message.Clear();
  705. reflection_tester.ExpectMessagesReleasedViaReflection(
  706. &message, TestUtil::ReflectionTester::CAN_BE_NULL);
  707. // Test a different code path for setting after releasing.
  708. TestUtil::SetAllFields(&message);
  709. TestUtil::ExpectAllFieldsSet(message);
  710. }
  711. TEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) {
  712. unittest::TestAllExtensions message;
  713. TestUtil::ReflectionTester reflection_tester(
  714. unittest::TestAllExtensions::descriptor());
  715. // When nothing is set, we expect all released messages to be NULL.
  716. reflection_tester.ExpectMessagesReleasedViaReflection(
  717. &message, TestUtil::ReflectionTester::IS_NULL);
  718. // After fields are set we should get non-NULL releases.
  719. reflection_tester.SetAllFieldsViaReflection(&message);
  720. reflection_tester.ExpectMessagesReleasedViaReflection(
  721. &message, TestUtil::ReflectionTester::NOT_NULL);
  722. // After Clear() we may or may not get a message from ReleaseMessage().
  723. // This is implementation specific.
  724. reflection_tester.SetAllFieldsViaReflection(&message);
  725. message.Clear();
  726. reflection_tester.ExpectMessagesReleasedViaReflection(
  727. &message, TestUtil::ReflectionTester::CAN_BE_NULL);
  728. // Test a different code path for setting after releasing.
  729. TestUtil::SetAllExtensions(&message);
  730. TestUtil::ExpectAllExtensionsSet(message);
  731. }
  732. TEST(GeneratedMessageReflectionTest, ReleaseOneofMessageTest) {
  733. unittest::TestOneof2 message;
  734. TestUtil::ReflectionTester::SetOneofViaReflection(&message);
  735. const Descriptor* descriptor = unittest::TestOneof2::descriptor();
  736. const Reflection* reflection = message.GetReflection();
  737. const Message& sub_message = reflection->GetMessage(
  738. message, descriptor->FindFieldByName("foo_lazy_message"));
  739. Message* released = reflection->ReleaseMessage(
  740. &message, descriptor->FindFieldByName("foo_lazy_message"));
  741. EXPECT_TRUE(released != NULL);
  742. EXPECT_EQ(&sub_message, released);
  743. delete released;
  744. released = reflection->ReleaseMessage(
  745. &message, descriptor->FindFieldByName("foo_lazy_message"));
  746. EXPECT_TRUE(released == NULL);
  747. }
  748. TEST(GeneratedMessageReflectionTest, ArenaReleaseMessageTest) {
  749. ::google::protobuf::Arena arena;
  750. unittest::TestAllTypes* message =
  751. ::google::protobuf::Arena::CreateMessage<unittest::TestAllTypes>(&arena);
  752. TestUtil::ReflectionTester reflection_tester(
  753. unittest::TestAllTypes::descriptor());
  754. // When nothing is set, we expect all released messages to be NULL.
  755. reflection_tester.ExpectMessagesReleasedViaReflection(
  756. message, TestUtil::ReflectionTester::IS_NULL);
  757. // After fields are set we should get non-NULL releases.
  758. reflection_tester.SetAllFieldsViaReflection(message);
  759. reflection_tester.ExpectMessagesReleasedViaReflection(
  760. message, TestUtil::ReflectionTester::NOT_NULL);
  761. // After Clear() we may or may not get a message from ReleaseMessage().
  762. // This is implementation specific.
  763. reflection_tester.SetAllFieldsViaReflection(message);
  764. message->Clear();
  765. reflection_tester.ExpectMessagesReleasedViaReflection(
  766. message, TestUtil::ReflectionTester::CAN_BE_NULL);
  767. }
  768. TEST(GeneratedMessageReflectionTest, ArenaReleaseExtensionMessageTest) {
  769. ::google::protobuf::Arena arena;
  770. unittest::TestAllExtensions* message =
  771. ::google::protobuf::Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
  772. TestUtil::ReflectionTester reflection_tester(
  773. unittest::TestAllExtensions::descriptor());
  774. // When nothing is set, we expect all released messages to be NULL.
  775. reflection_tester.ExpectMessagesReleasedViaReflection(
  776. message, TestUtil::ReflectionTester::IS_NULL);
  777. // After fields are set we should get non-NULL releases.
  778. reflection_tester.SetAllFieldsViaReflection(message);
  779. reflection_tester.ExpectMessagesReleasedViaReflection(
  780. message, TestUtil::ReflectionTester::NOT_NULL);
  781. // After Clear() we may or may not get a message from ReleaseMessage().
  782. // This is implementation specific.
  783. reflection_tester.SetAllFieldsViaReflection(message);
  784. message->Clear();
  785. reflection_tester.ExpectMessagesReleasedViaReflection(
  786. message, TestUtil::ReflectionTester::CAN_BE_NULL);
  787. }
  788. TEST(GeneratedMessageReflectionTest, ArenaReleaseOneofMessageTest) {
  789. ::google::protobuf::Arena arena;
  790. unittest::TestOneof2* message =
  791. ::google::protobuf::Arena::CreateMessage<unittest::TestOneof2>(&arena);
  792. TestUtil::ReflectionTester::SetOneofViaReflection(message);
  793. const Descriptor* descriptor = unittest::TestOneof2::descriptor();
  794. const Reflection* reflection = message->GetReflection();
  795. Message* released = reflection->ReleaseMessage(
  796. message, descriptor->FindFieldByName("foo_lazy_message"));
  797. EXPECT_TRUE(released != NULL);
  798. delete released;
  799. released = reflection->ReleaseMessage(
  800. message, descriptor->FindFieldByName("foo_lazy_message"));
  801. EXPECT_TRUE(released == NULL);
  802. }
  803. #ifdef PROTOBUF_HAS_DEATH_TEST
  804. TEST(GeneratedMessageReflectionTest, UsageErrors) {
  805. unittest::TestAllTypes message;
  806. const Reflection* reflection = message.GetReflection();
  807. const Descriptor* descriptor = message.GetDescriptor();
  808. #define f(NAME) descriptor->FindFieldByName(NAME)
  809. // Testing every single failure mode would be too much work. Let's just
  810. // check a few.
  811. EXPECT_DEATH(
  812. reflection->GetInt32(
  813. message, descriptor->FindFieldByName("optional_int64")),
  814. "Protocol Buffer reflection usage error:\n"
  815. " Method : google::protobuf::Reflection::GetInt32\n"
  816. " Message type: protobuf_unittest\\.TestAllTypes\n"
  817. " Field : protobuf_unittest\\.TestAllTypes\\.optional_int64\n"
  818. " Problem : Field is not the right type for this message:\n"
  819. " Expected : CPPTYPE_INT32\n"
  820. " Field type: CPPTYPE_INT64");
  821. EXPECT_DEATH(
  822. reflection->GetInt32(
  823. message, descriptor->FindFieldByName("repeated_int32")),
  824. "Protocol Buffer reflection usage error:\n"
  825. " Method : google::protobuf::Reflection::GetInt32\n"
  826. " Message type: protobuf_unittest.TestAllTypes\n"
  827. " Field : protobuf_unittest.TestAllTypes.repeated_int32\n"
  828. " Problem : Field is repeated; the method requires a singular field.");
  829. EXPECT_DEATH(
  830. reflection->GetInt32(
  831. message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
  832. "Protocol Buffer reflection usage error:\n"
  833. " Method : google::protobuf::Reflection::GetInt32\n"
  834. " Message type: protobuf_unittest.TestAllTypes\n"
  835. " Field : protobuf_unittest.ForeignMessage.c\n"
  836. " Problem : Field does not match message type.");
  837. EXPECT_DEATH(
  838. reflection->HasField(
  839. message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
  840. "Protocol Buffer reflection usage error:\n"
  841. " Method : google::protobuf::Reflection::HasField\n"
  842. " Message type: protobuf_unittest.TestAllTypes\n"
  843. " Field : protobuf_unittest.ForeignMessage.c\n"
  844. " Problem : Field does not match message type.");
  845. #undef f
  846. }
  847. #endif // PROTOBUF_HAS_DEATH_TEST
  848. } // namespace
  849. } // namespace protobuf
  850. } // namespace google