诸暨麻将添加redis
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

1326 Zeilen
56 KiB

  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. #include <google/protobuf/stubs/casts.h>
  34. #include <google/protobuf/stubs/strutil.h>
  35. #include <google/protobuf/test_util.h>
  36. #include <google/protobuf/test_util2.h>
  37. #include <google/protobuf/unittest.pb.h>
  38. #include <google/protobuf/unittest_mset.pb.h>
  39. #include <google/protobuf/io/coded_stream.h>
  40. #include <google/protobuf/io/zero_copy_stream_impl.h>
  41. #include <google/protobuf/descriptor.pb.h>
  42. #include <google/protobuf/arena.h>
  43. #include <google/protobuf/descriptor.h>
  44. #include <google/protobuf/dynamic_message.h>
  45. #include <google/protobuf/extension_set.h>
  46. #include <google/protobuf/wire_format.h>
  47. #include <google/protobuf/stubs/logging.h>
  48. #include <google/protobuf/stubs/common.h>
  49. #include <google/protobuf/testing/googletest.h>
  50. #include <gtest/gtest.h>
  51. #include <google/protobuf/stubs/stl_util.h>
  52. namespace google {
  53. namespace protobuf {
  54. namespace internal {
  55. namespace {
  56. using TestUtil::EqualsToSerialized;
  57. // This test closely mirrors net/proto2/compiler/cpp/internal/unittest.cc
  58. // except that it uses extensions rather than regular fields.
  59. TEST(ExtensionSetTest, Defaults) {
  60. // Check that all default values are set correctly in the initial message.
  61. unittest::TestAllExtensions message;
  62. TestUtil::ExpectExtensionsClear(message);
  63. // Messages should return pointers to default instances until first use.
  64. // (This is not checked by ExpectClear() since it is not actually true after
  65. // the fields have been set and then cleared.)
  66. EXPECT_EQ(&unittest::OptionalGroup_extension::default_instance(),
  67. &message.GetExtension(unittest::optionalgroup_extension));
  68. EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),
  69. &message.GetExtension(unittest::optional_nested_message_extension));
  70. EXPECT_EQ(
  71. &unittest::ForeignMessage::default_instance(),
  72. &message.GetExtension(unittest::optional_foreign_message_extension));
  73. EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),
  74. &message.GetExtension(unittest::optional_import_message_extension));
  75. }
  76. TEST(ExtensionSetTest, Accessors) {
  77. // Set every field to a unique value then go back and check all those
  78. // values.
  79. unittest::TestAllExtensions message;
  80. TestUtil::SetAllExtensions(&message);
  81. TestUtil::ExpectAllExtensionsSet(message);
  82. TestUtil::ModifyRepeatedExtensions(&message);
  83. TestUtil::ExpectRepeatedExtensionsModified(message);
  84. }
  85. TEST(ExtensionSetTest, Clear) {
  86. // Set every field to a unique value, clear the message, then check that
  87. // it is cleared.
  88. unittest::TestAllExtensions message;
  89. TestUtil::SetAllExtensions(&message);
  90. message.Clear();
  91. TestUtil::ExpectExtensionsClear(message);
  92. // Unlike with the defaults test, we do NOT expect that requesting embedded
  93. // messages will return a pointer to the default instance. Instead, they
  94. // should return the objects that were created when mutable_blah() was
  95. // called.
  96. EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(),
  97. &message.GetExtension(unittest::optionalgroup_extension));
  98. EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
  99. &message.GetExtension(unittest::optional_nested_message_extension));
  100. EXPECT_NE(
  101. &unittest::ForeignMessage::default_instance(),
  102. &message.GetExtension(unittest::optional_foreign_message_extension));
  103. EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
  104. &message.GetExtension(unittest::optional_import_message_extension));
  105. // Make sure setting stuff again after clearing works. (This takes slightly
  106. // different code paths since the objects are reused.)
  107. TestUtil::SetAllExtensions(&message);
  108. TestUtil::ExpectAllExtensionsSet(message);
  109. }
  110. TEST(ExtensionSetTest, ClearOneField) {
  111. // Set every field to a unique value, then clear one value and insure that
  112. // only that one value is cleared.
  113. unittest::TestAllExtensions message;
  114. TestUtil::SetAllExtensions(&message);
  115. int64 original_value =
  116. message.GetExtension(unittest::optional_int64_extension);
  117. // Clear the field and make sure it shows up as cleared.
  118. message.ClearExtension(unittest::optional_int64_extension);
  119. EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension));
  120. EXPECT_EQ(0, message.GetExtension(unittest::optional_int64_extension));
  121. // Other adjacent fields should not be cleared.
  122. EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension));
  123. EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension));
  124. // Make sure if we set it again, then all fields are set.
  125. message.SetExtension(unittest::optional_int64_extension, original_value);
  126. TestUtil::ExpectAllExtensionsSet(message);
  127. }
  128. TEST(ExtensionSetTest, SetAllocatedExtension) {
  129. unittest::TestAllExtensions message;
  130. EXPECT_FALSE(
  131. message.HasExtension(unittest::optional_foreign_message_extension));
  132. // Add a extension using SetAllocatedExtension
  133. unittest::ForeignMessage* foreign_message = new unittest::ForeignMessage();
  134. message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
  135. foreign_message);
  136. EXPECT_TRUE(
  137. message.HasExtension(unittest::optional_foreign_message_extension));
  138. EXPECT_EQ(foreign_message, message.MutableExtension(
  139. unittest::optional_foreign_message_extension));
  140. EXPECT_EQ(foreign_message, &message.GetExtension(
  141. unittest::optional_foreign_message_extension));
  142. // SetAllocatedExtension should delete the previously existing extension.
  143. // (We reply on unittest to check memory leaks for this case)
  144. message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
  145. new unittest::ForeignMessage());
  146. // SetAllocatedExtension with a NULL parameter is equivalent to ClearExtenion.
  147. message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
  148. NULL);
  149. EXPECT_FALSE(
  150. message.HasExtension(unittest::optional_foreign_message_extension));
  151. }
  152. TEST(ExtensionSetTest, ReleaseExtension) {
  153. proto2_wireformat_unittest::TestMessageSet message;
  154. EXPECT_FALSE(message.HasExtension(
  155. unittest::TestMessageSetExtension1::message_set_extension));
  156. // Add a extension using SetAllocatedExtension
  157. unittest::TestMessageSetExtension1* extension =
  158. new unittest::TestMessageSetExtension1();
  159. message.SetAllocatedExtension(
  160. unittest::TestMessageSetExtension1::message_set_extension, extension);
  161. EXPECT_TRUE(message.HasExtension(
  162. unittest::TestMessageSetExtension1::message_set_extension));
  163. // Release the extension using ReleaseExtension
  164. unittest::TestMessageSetExtension1* released_extension =
  165. message.ReleaseExtension(
  166. unittest::TestMessageSetExtension1::message_set_extension);
  167. EXPECT_EQ(extension, released_extension);
  168. EXPECT_FALSE(message.HasExtension(
  169. unittest::TestMessageSetExtension1::message_set_extension));
  170. // ReleaseExtension will return the underlying object even after
  171. // ClearExtension is called.
  172. message.SetAllocatedExtension(
  173. unittest::TestMessageSetExtension1::message_set_extension, extension);
  174. message.ClearExtension(
  175. unittest::TestMessageSetExtension1::message_set_extension);
  176. released_extension = message.ReleaseExtension(
  177. unittest::TestMessageSetExtension1::message_set_extension);
  178. EXPECT_TRUE(released_extension != NULL);
  179. delete released_extension;
  180. }
  181. TEST(ExtensionSetTest, ArenaUnsafeArenaSetAllocatedAndRelease) {
  182. Arena arena;
  183. unittest::TestAllExtensions* message =
  184. Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
  185. unittest::ForeignMessage extension;
  186. message->UnsafeArenaSetAllocatedExtension(
  187. unittest::optional_foreign_message_extension, &extension);
  188. // No copy when set.
  189. unittest::ForeignMessage* mutable_extension =
  190. message->MutableExtension(unittest::optional_foreign_message_extension);
  191. EXPECT_EQ(&extension, mutable_extension);
  192. // No copy when unsafe released.
  193. unittest::ForeignMessage* released_extension =
  194. message->UnsafeArenaReleaseExtension(
  195. unittest::optional_foreign_message_extension);
  196. EXPECT_EQ(&extension, released_extension);
  197. EXPECT_FALSE(
  198. message->HasExtension(unittest::optional_foreign_message_extension));
  199. // Set the ownership back and let the destructors run. It should not take
  200. // ownership, so this should not crash.
  201. message->UnsafeArenaSetAllocatedExtension(
  202. unittest::optional_foreign_message_extension, &extension);
  203. }
  204. TEST(ExtensionSetTest, UnsafeArenaSetAllocatedAndRelease) {
  205. unittest::TestAllExtensions message;
  206. unittest::ForeignMessage* extension = new unittest::ForeignMessage();
  207. message.UnsafeArenaSetAllocatedExtension(
  208. unittest::optional_foreign_message_extension, extension);
  209. // No copy when set.
  210. unittest::ForeignMessage* mutable_extension =
  211. message.MutableExtension(unittest::optional_foreign_message_extension);
  212. EXPECT_EQ(extension, mutable_extension);
  213. // No copy when unsafe released.
  214. unittest::ForeignMessage* released_extension =
  215. message.UnsafeArenaReleaseExtension(
  216. unittest::optional_foreign_message_extension);
  217. EXPECT_EQ(extension, released_extension);
  218. EXPECT_FALSE(
  219. message.HasExtension(unittest::optional_foreign_message_extension));
  220. // Set the ownership back and let the destructors run. It should take
  221. // ownership, so this should not leak.
  222. message.UnsafeArenaSetAllocatedExtension(
  223. unittest::optional_foreign_message_extension, extension);
  224. }
  225. TEST(ExtensionSetTest, ArenaUnsafeArenaReleaseOfHeapAlloc) {
  226. Arena arena;
  227. unittest::TestAllExtensions* message =
  228. Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
  229. unittest::ForeignMessage* extension = new unittest::ForeignMessage;
  230. message->SetAllocatedExtension(unittest::optional_foreign_message_extension,
  231. extension);
  232. // The arena should maintain ownership of the heap allocated proto because we
  233. // used UnsafeArenaReleaseExtension. The leak checker will ensure this.
  234. unittest::ForeignMessage* released_extension =
  235. message->UnsafeArenaReleaseExtension(
  236. unittest::optional_foreign_message_extension);
  237. EXPECT_EQ(extension, released_extension);
  238. EXPECT_FALSE(
  239. message->HasExtension(unittest::optional_foreign_message_extension));
  240. }
  241. TEST(ExtensionSetTest, CopyFrom) {
  242. unittest::TestAllExtensions message1, message2;
  243. TestUtil::SetAllExtensions(&message1);
  244. message2.CopyFrom(message1);
  245. TestUtil::ExpectAllExtensionsSet(message2);
  246. message2.CopyFrom(message1); // exercise copy when fields already exist
  247. TestUtil::ExpectAllExtensionsSet(message2);
  248. }
  249. TEST(ExtensionSetTest, CopyFromPacked) {
  250. unittest::TestPackedExtensions message1, message2;
  251. TestUtil::SetPackedExtensions(&message1);
  252. message2.CopyFrom(message1);
  253. TestUtil::ExpectPackedExtensionsSet(message2);
  254. message2.CopyFrom(message1); // exercise copy when fields already exist
  255. TestUtil::ExpectPackedExtensionsSet(message2);
  256. }
  257. TEST(ExtensionSetTest, CopyFromUpcasted) {
  258. unittest::TestAllExtensions message1, message2;
  259. const Message& upcasted_message = message1;
  260. TestUtil::SetAllExtensions(&message1);
  261. message2.CopyFrom(upcasted_message);
  262. TestUtil::ExpectAllExtensionsSet(message2);
  263. // exercise copy when fields already exist
  264. message2.CopyFrom(upcasted_message);
  265. TestUtil::ExpectAllExtensionsSet(message2);
  266. }
  267. TEST(ExtensionSetTest, SwapWithEmpty) {
  268. unittest::TestAllExtensions message1, message2;
  269. TestUtil::SetAllExtensions(&message1);
  270. TestUtil::ExpectAllExtensionsSet(message1);
  271. TestUtil::ExpectExtensionsClear(message2);
  272. message1.Swap(&message2);
  273. TestUtil::ExpectAllExtensionsSet(message2);
  274. TestUtil::ExpectExtensionsClear(message1);
  275. }
  276. TEST(ExtensionSetTest, SwapWithSelf) {
  277. unittest::TestAllExtensions message;
  278. TestUtil::SetAllExtensions(&message);
  279. TestUtil::ExpectAllExtensionsSet(message);
  280. message.Swap(&message);
  281. TestUtil::ExpectAllExtensionsSet(message);
  282. }
  283. TEST(ExtensionSetTest, SwapExtension) {
  284. unittest::TestAllExtensions message1;
  285. unittest::TestAllExtensions message2;
  286. TestUtil::SetAllExtensions(&message1);
  287. std::vector<const FieldDescriptor*> fields;
  288. // Swap empty fields.
  289. const Reflection* reflection = message1.GetReflection();
  290. reflection->SwapFields(&message1, &message2, fields);
  291. TestUtil::ExpectAllExtensionsSet(message1);
  292. TestUtil::ExpectExtensionsClear(message2);
  293. // Swap two extensions.
  294. fields.push_back(reflection->FindKnownExtensionByNumber(12));
  295. fields.push_back(reflection->FindKnownExtensionByNumber(25));
  296. reflection->SwapFields(&message1, &message2, fields);
  297. EXPECT_TRUE(message1.HasExtension(unittest::optional_int32_extension));
  298. EXPECT_FALSE(message1.HasExtension(unittest::optional_double_extension));
  299. EXPECT_FALSE(message1.HasExtension(unittest::optional_cord_extension));
  300. EXPECT_FALSE(message2.HasExtension(unittest::optional_int32_extension));
  301. EXPECT_TRUE(message2.HasExtension(unittest::optional_double_extension));
  302. EXPECT_TRUE(message2.HasExtension(unittest::optional_cord_extension));
  303. }
  304. TEST(ExtensionSetTest, SwapExtensionWithEmpty) {
  305. unittest::TestAllExtensions message1;
  306. unittest::TestAllExtensions message2;
  307. unittest::TestAllExtensions message3;
  308. TestUtil::SetAllExtensions(&message3);
  309. const Reflection* reflection = message3.GetReflection();
  310. std::vector<const FieldDescriptor*> fields;
  311. reflection->ListFields(message3, &fields);
  312. reflection->SwapFields(&message1, &message2, fields);
  313. TestUtil::ExpectExtensionsClear(message1);
  314. TestUtil::ExpectExtensionsClear(message2);
  315. }
  316. TEST(ExtensionSetTest, SwapExtensionBothFull) {
  317. unittest::TestAllExtensions message1;
  318. unittest::TestAllExtensions message2;
  319. TestUtil::SetAllExtensions(&message1);
  320. TestUtil::SetAllExtensions(&message2);
  321. const Reflection* reflection = message1.GetReflection();
  322. std::vector<const FieldDescriptor*> fields;
  323. reflection->ListFields(message1, &fields);
  324. reflection->SwapFields(&message1, &message2, fields);
  325. TestUtil::ExpectAllExtensionsSet(message1);
  326. TestUtil::ExpectAllExtensionsSet(message2);
  327. }
  328. TEST(ExtensionSetTest, ArenaSetAllExtension) {
  329. Arena arena1;
  330. unittest::TestAllExtensions* message1 =
  331. Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
  332. TestUtil::SetAllExtensions(message1);
  333. TestUtil::ExpectAllExtensionsSet(*message1);
  334. }
  335. TEST(ExtensionSetTest, ArenaCopyConstructor) {
  336. Arena arena1;
  337. unittest::TestAllExtensions* message1 =
  338. Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
  339. TestUtil::SetAllExtensions(message1);
  340. unittest::TestAllExtensions message2(*message1);
  341. arena1.Reset();
  342. TestUtil::ExpectAllExtensionsSet(message2);
  343. }
  344. TEST(ExtensionSetTest, ArenaMergeFrom) {
  345. Arena arena1;
  346. unittest::TestAllExtensions* message1 =
  347. Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
  348. TestUtil::SetAllExtensions(message1);
  349. unittest::TestAllExtensions message2;
  350. message2.MergeFrom(*message1);
  351. arena1.Reset();
  352. TestUtil::ExpectAllExtensionsSet(message2);
  353. }
  354. TEST(ExtensionSetTest, ArenaSetAllocatedMessageAndRelease) {
  355. Arena arena;
  356. unittest::TestAllExtensions* message =
  357. Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
  358. EXPECT_FALSE(
  359. message->HasExtension(unittest::optional_foreign_message_extension));
  360. // Add a extension using SetAllocatedExtension
  361. unittest::ForeignMessage* foreign_message = new unittest::ForeignMessage();
  362. message->SetAllocatedExtension(unittest::optional_foreign_message_extension,
  363. foreign_message);
  364. // foreign_message is now owned by the arena.
  365. EXPECT_EQ(foreign_message, message->MutableExtension(
  366. unittest::optional_foreign_message_extension));
  367. // Underlying message is copied, and returned.
  368. unittest::ForeignMessage* released_message =
  369. message->ReleaseExtension(unittest::optional_foreign_message_extension);
  370. delete released_message;
  371. EXPECT_FALSE(
  372. message->HasExtension(unittest::optional_foreign_message_extension));
  373. }
  374. TEST(ExtensionSetTest, SwapExtensionBothFullWithArena) {
  375. Arena arena1;
  376. std::unique_ptr<Arena> arena2(new Arena());
  377. unittest::TestAllExtensions* message1 =
  378. Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
  379. unittest::TestAllExtensions* message2 =
  380. Arena::CreateMessage<unittest::TestAllExtensions>(arena2.get());
  381. TestUtil::SetAllExtensions(message1);
  382. TestUtil::SetAllExtensions(message2);
  383. message1->SetExtension(unittest::optional_int32_extension, 1);
  384. message2->SetExtension(unittest::optional_int32_extension, 2);
  385. message1->Swap(message2);
  386. EXPECT_EQ(2, message1->GetExtension(unittest::optional_int32_extension));
  387. EXPECT_EQ(1, message2->GetExtension(unittest::optional_int32_extension));
  388. // Re-set the original values so ExpectAllExtensionsSet is happy.
  389. message1->SetExtension(unittest::optional_int32_extension, 101);
  390. message2->SetExtension(unittest::optional_int32_extension, 101);
  391. TestUtil::ExpectAllExtensionsSet(*message1);
  392. TestUtil::ExpectAllExtensionsSet(*message2);
  393. arena2.reset(NULL);
  394. TestUtil::ExpectAllExtensionsSet(*message1);
  395. // Test corner cases, when one is empty and other is not.
  396. Arena arena3, arena4;
  397. unittest::TestAllExtensions* message3 =
  398. Arena::CreateMessage<unittest::TestAllExtensions>(&arena3);
  399. unittest::TestAllExtensions* message4 =
  400. Arena::CreateMessage<unittest::TestAllExtensions>(&arena4);
  401. TestUtil::SetAllExtensions(message3);
  402. message3->Swap(message4);
  403. arena3.Reset();
  404. TestUtil::ExpectAllExtensionsSet(*message4);
  405. }
  406. TEST(ExtensionSetTest, SwapFieldsOfExtensionBothFullWithArena) {
  407. Arena arena1;
  408. Arena* arena2 = new Arena();
  409. unittest::TestAllExtensions* message1 =
  410. Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
  411. unittest::TestAllExtensions* message2 =
  412. Arena::CreateMessage<unittest::TestAllExtensions>(arena2);
  413. TestUtil::SetAllExtensions(message1);
  414. TestUtil::SetAllExtensions(message2);
  415. const Reflection* reflection = message1->GetReflection();
  416. std::vector<const FieldDescriptor*> fields;
  417. reflection->ListFields(*message1, &fields);
  418. reflection->SwapFields(message1, message2, fields);
  419. TestUtil::ExpectAllExtensionsSet(*message1);
  420. TestUtil::ExpectAllExtensionsSet(*message2);
  421. delete arena2;
  422. TestUtil::ExpectAllExtensionsSet(*message1);
  423. }
  424. TEST(ExtensionSetTest, SwapExtensionWithSelf) {
  425. unittest::TestAllExtensions message1;
  426. TestUtil::SetAllExtensions(&message1);
  427. std::vector<const FieldDescriptor*> fields;
  428. const Reflection* reflection = message1.GetReflection();
  429. reflection->ListFields(message1, &fields);
  430. reflection->SwapFields(&message1, &message1, fields);
  431. TestUtil::ExpectAllExtensionsSet(message1);
  432. }
  433. TEST(ExtensionSetTest, SerializationToArray) {
  434. // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire
  435. // compatibility of extensions.
  436. //
  437. // This checks serialization to a flat array by explicitly reserving space in
  438. // the string and calling the generated message's
  439. // SerializeWithCachedSizesToArray.
  440. unittest::TestAllExtensions source;
  441. unittest::TestAllTypes destination;
  442. TestUtil::SetAllExtensions(&source);
  443. int size = source.ByteSize();
  444. std::string data;
  445. data.resize(size);
  446. uint8* target = reinterpret_cast<uint8*>(::google::protobuf::string_as_array(&data));
  447. uint8* end = source.SerializeWithCachedSizesToArray(target);
  448. EXPECT_EQ(size, end - target);
  449. EXPECT_TRUE(destination.ParseFromString(data));
  450. TestUtil::ExpectAllFieldsSet(destination);
  451. }
  452. TEST(ExtensionSetTest, SerializationToStream) {
  453. // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire
  454. // compatibility of extensions.
  455. //
  456. // This checks serialization to an output stream by creating an array output
  457. // stream that can only buffer 1 byte at a time - this prevents the message
  458. // from ever jumping to the fast path, ensuring that serialization happens via
  459. // the CodedOutputStream.
  460. unittest::TestAllExtensions source;
  461. unittest::TestAllTypes destination;
  462. TestUtil::SetAllExtensions(&source);
  463. int size = source.ByteSize();
  464. std::string data;
  465. data.resize(size);
  466. {
  467. io::ArrayOutputStream array_stream(::google::protobuf::string_as_array(&data), size, 1);
  468. io::CodedOutputStream output_stream(&array_stream);
  469. source.SerializeWithCachedSizes(&output_stream);
  470. ASSERT_FALSE(output_stream.HadError());
  471. }
  472. EXPECT_TRUE(destination.ParseFromString(data));
  473. TestUtil::ExpectAllFieldsSet(destination);
  474. }
  475. TEST(ExtensionSetTest, PackedSerializationToArray) {
  476. // Serialize as TestPackedExtensions and parse as TestPackedTypes to insure
  477. // wire compatibility of extensions.
  478. //
  479. // This checks serialization to a flat array by explicitly reserving space in
  480. // the string and calling the generated message's
  481. // SerializeWithCachedSizesToArray.
  482. unittest::TestPackedExtensions source;
  483. unittest::TestPackedTypes destination;
  484. TestUtil::SetPackedExtensions(&source);
  485. int size = source.ByteSize();
  486. std::string data;
  487. data.resize(size);
  488. uint8* target = reinterpret_cast<uint8*>(::google::protobuf::string_as_array(&data));
  489. uint8* end = source.SerializeWithCachedSizesToArray(target);
  490. EXPECT_EQ(size, end - target);
  491. EXPECT_TRUE(destination.ParseFromString(data));
  492. TestUtil::ExpectPackedFieldsSet(destination);
  493. }
  494. TEST(ExtensionSetTest, PackedSerializationToStream) {
  495. // Serialize as TestPackedExtensions and parse as TestPackedTypes to insure
  496. // wire compatibility of extensions.
  497. //
  498. // This checks serialization to an output stream by creating an array output
  499. // stream that can only buffer 1 byte at a time - this prevents the message
  500. // from ever jumping to the fast path, ensuring that serialization happens via
  501. // the CodedOutputStream.
  502. unittest::TestPackedExtensions source;
  503. unittest::TestPackedTypes destination;
  504. TestUtil::SetPackedExtensions(&source);
  505. int size = source.ByteSize();
  506. std::string data;
  507. data.resize(size);
  508. {
  509. io::ArrayOutputStream array_stream(::google::protobuf::string_as_array(&data), size, 1);
  510. io::CodedOutputStream output_stream(&array_stream);
  511. source.SerializeWithCachedSizes(&output_stream);
  512. ASSERT_FALSE(output_stream.HadError());
  513. }
  514. EXPECT_TRUE(destination.ParseFromString(data));
  515. TestUtil::ExpectPackedFieldsSet(destination);
  516. }
  517. TEST(ExtensionSetTest, NestedExtensionGroup) {
  518. // Serialize as TestGroup and parse as TestGroupExtension.
  519. unittest::TestGroup source;
  520. unittest::TestGroupExtension destination;
  521. std::string data;
  522. source.mutable_optionalgroup()->set_a(117);
  523. source.set_optional_foreign_enum(unittest::FOREIGN_BAZ);
  524. source.SerializeToString(&data);
  525. EXPECT_TRUE(destination.ParseFromString(data));
  526. EXPECT_TRUE(
  527. destination
  528. .GetExtension(unittest::TestNestedExtension::optionalgroup_extension)
  529. .has_a());
  530. EXPECT_EQ(117, destination
  531. .GetExtension(
  532. unittest::TestNestedExtension::optionalgroup_extension)
  533. .a());
  534. EXPECT_TRUE(destination.HasExtension(
  535. unittest::TestNestedExtension::optional_foreign_enum_extension));
  536. EXPECT_EQ(
  537. unittest::FOREIGN_BAZ,
  538. destination.GetExtension(
  539. unittest::TestNestedExtension::optional_foreign_enum_extension));
  540. }
  541. TEST(ExtensionSetTest, Parsing) {
  542. // Serialize as TestAllTypes and parse as TestAllExtensions.
  543. unittest::TestAllTypes source;
  544. unittest::TestAllExtensions destination;
  545. std::string data;
  546. TestUtil::SetAllFields(&source);
  547. source.SerializeToString(&data);
  548. EXPECT_TRUE(destination.ParseFromString(data));
  549. TestUtil::SetOneofFields(&destination);
  550. TestUtil::ExpectAllExtensionsSet(destination);
  551. }
  552. TEST(ExtensionSetTest, PackedParsing) {
  553. // Serialize as TestPackedTypes and parse as TestPackedExtensions.
  554. unittest::TestPackedTypes source;
  555. unittest::TestPackedExtensions destination;
  556. std::string data;
  557. TestUtil::SetPackedFields(&source);
  558. source.SerializeToString(&data);
  559. EXPECT_TRUE(destination.ParseFromString(data));
  560. TestUtil::ExpectPackedExtensionsSet(destination);
  561. }
  562. TEST(ExtensionSetTest, PackedToUnpackedParsing) {
  563. unittest::TestPackedTypes source;
  564. unittest::TestUnpackedExtensions destination;
  565. std::string data;
  566. TestUtil::SetPackedFields(&source);
  567. source.SerializeToString(&data);
  568. EXPECT_TRUE(destination.ParseFromString(data));
  569. TestUtil::ExpectUnpackedExtensionsSet(destination);
  570. // Reserialize
  571. unittest::TestUnpackedTypes unpacked;
  572. TestUtil::SetUnpackedFields(&unpacked);
  573. // Serialized proto has to be the same size and parsed to the same message.
  574. EXPECT_EQ(unpacked.SerializeAsString().size(),
  575. destination.SerializeAsString().size());
  576. EXPECT_TRUE(EqualsToSerialized(unpacked, destination.SerializeAsString()));
  577. // Make sure we can add extensions.
  578. destination.AddExtension(unittest::unpacked_int32_extension, 1);
  579. destination.AddExtension(unittest::unpacked_enum_extension,
  580. protobuf_unittest::FOREIGN_BAR);
  581. }
  582. TEST(ExtensionSetTest, UnpackedToPackedParsing) {
  583. unittest::TestUnpackedTypes source;
  584. unittest::TestPackedExtensions destination;
  585. std::string data;
  586. TestUtil::SetUnpackedFields(&source);
  587. source.SerializeToString(&data);
  588. EXPECT_TRUE(destination.ParseFromString(data));
  589. TestUtil::ExpectPackedExtensionsSet(destination);
  590. // Reserialize
  591. unittest::TestPackedTypes packed;
  592. TestUtil::SetPackedFields(&packed);
  593. // Serialized proto has to be the same size and parsed to the same message.
  594. EXPECT_EQ(packed.SerializeAsString().size(),
  595. destination.SerializeAsString().size());
  596. EXPECT_TRUE(EqualsToSerialized(packed, destination.SerializeAsString()));
  597. // Make sure we can add extensions.
  598. destination.AddExtension(unittest::packed_int32_extension, 1);
  599. destination.AddExtension(unittest::packed_enum_extension,
  600. protobuf_unittest::FOREIGN_BAR);
  601. }
  602. TEST(ExtensionSetTest, IsInitialized) {
  603. // Test that IsInitialized() returns false if required fields in nested
  604. // extensions are missing.
  605. unittest::TestAllExtensions message;
  606. EXPECT_TRUE(message.IsInitialized());
  607. message.MutableExtension(unittest::TestRequired::single);
  608. EXPECT_FALSE(message.IsInitialized());
  609. message.MutableExtension(unittest::TestRequired::single)->set_a(1);
  610. EXPECT_FALSE(message.IsInitialized());
  611. message.MutableExtension(unittest::TestRequired::single)->set_b(2);
  612. EXPECT_FALSE(message.IsInitialized());
  613. message.MutableExtension(unittest::TestRequired::single)->set_c(3);
  614. EXPECT_TRUE(message.IsInitialized());
  615. message.AddExtension(unittest::TestRequired::multi);
  616. EXPECT_FALSE(message.IsInitialized());
  617. message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1);
  618. EXPECT_FALSE(message.IsInitialized());
  619. message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2);
  620. EXPECT_FALSE(message.IsInitialized());
  621. message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3);
  622. EXPECT_TRUE(message.IsInitialized());
  623. }
  624. TEST(ExtensionSetTest, MutableString) {
  625. // Test the mutable string accessors.
  626. unittest::TestAllExtensions message;
  627. message.MutableExtension(unittest::optional_string_extension)->assign("foo");
  628. EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension));
  629. EXPECT_EQ("foo", message.GetExtension(unittest::optional_string_extension));
  630. message.AddExtension(unittest::repeated_string_extension)->assign("bar");
  631. ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_extension));
  632. EXPECT_EQ("bar",
  633. message.GetExtension(unittest::repeated_string_extension, 0));
  634. }
  635. TEST(ExtensionSetTest, SpaceUsedExcludingSelf) {
  636. // Scalar primitive extensions should increase the extension set size by a
  637. // minimum of the size of the primitive type.
  638. #define TEST_SCALAR_EXTENSIONS_SPACE_USED(type, value) \
  639. do { \
  640. unittest::TestAllExtensions message; \
  641. const int base_size = message.SpaceUsed(); \
  642. message.SetExtension(unittest::optional_##type##_extension, value); \
  643. int min_expected_size = \
  644. base_size + \
  645. sizeof(message.GetExtension(unittest::optional_##type##_extension)); \
  646. EXPECT_LE(min_expected_size, message.SpaceUsed()); \
  647. } while (0)
  648. TEST_SCALAR_EXTENSIONS_SPACE_USED(int32, 101);
  649. TEST_SCALAR_EXTENSIONS_SPACE_USED(int64, 102);
  650. TEST_SCALAR_EXTENSIONS_SPACE_USED(uint32, 103);
  651. TEST_SCALAR_EXTENSIONS_SPACE_USED(uint64, 104);
  652. TEST_SCALAR_EXTENSIONS_SPACE_USED(sint32, 105);
  653. TEST_SCALAR_EXTENSIONS_SPACE_USED(sint64, 106);
  654. TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed32, 107);
  655. TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed64, 108);
  656. TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed32, 109);
  657. TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed64, 110);
  658. TEST_SCALAR_EXTENSIONS_SPACE_USED(float, 111);
  659. TEST_SCALAR_EXTENSIONS_SPACE_USED(double, 112);
  660. TEST_SCALAR_EXTENSIONS_SPACE_USED(bool, true);
  661. #undef TEST_SCALAR_EXTENSIONS_SPACE_USED
  662. {
  663. unittest::TestAllExtensions message;
  664. const int base_size = message.SpaceUsed();
  665. message.SetExtension(unittest::optional_nested_enum_extension,
  666. unittest::TestAllTypes::FOO);
  667. int min_expected_size =
  668. base_size +
  669. sizeof(message.GetExtension(unittest::optional_nested_enum_extension));
  670. EXPECT_LE(min_expected_size, message.SpaceUsed());
  671. }
  672. {
  673. // Strings may cause extra allocations depending on their length; ensure
  674. // that gets included as well.
  675. unittest::TestAllExtensions message;
  676. const int base_size = message.SpaceUsed();
  677. const std::string s(
  678. "this is a fairly large string that will cause some "
  679. "allocation in order to store it in the extension");
  680. message.SetExtension(unittest::optional_string_extension, s);
  681. int min_expected_size = base_size + s.length();
  682. EXPECT_LE(min_expected_size, message.SpaceUsed());
  683. }
  684. {
  685. // Messages also have additional allocation that need to be counted.
  686. unittest::TestAllExtensions message;
  687. const int base_size = message.SpaceUsed();
  688. unittest::ForeignMessage foreign;
  689. foreign.set_c(42);
  690. message.MutableExtension(unittest::optional_foreign_message_extension)
  691. ->CopyFrom(foreign);
  692. int min_expected_size = base_size + foreign.SpaceUsed();
  693. EXPECT_LE(min_expected_size, message.SpaceUsed());
  694. }
  695. // Repeated primitive extensions will increase space used by at least a
  696. // RepeatedField<T>, and will cause additional allocations when the array
  697. // gets too big for the initial space.
  698. // This macro:
  699. // - Adds a value to the repeated extension, then clears it, establishing
  700. // the base size.
  701. // - Adds a small number of values, testing that it doesn't increase the
  702. // SpaceUsed()
  703. // - Adds a large number of values (requiring allocation in the repeated
  704. // field), and ensures that that allocation is included in SpaceUsed()
  705. #define TEST_REPEATED_EXTENSIONS_SPACE_USED(type, cpptype, value) \
  706. do { \
  707. unittest::TestAllExtensions message; \
  708. const int base_size = message.SpaceUsed(); \
  709. int min_expected_size = sizeof(RepeatedField<cpptype>) + base_size; \
  710. message.AddExtension(unittest::repeated_##type##_extension, value); \
  711. message.ClearExtension(unittest::repeated_##type##_extension); \
  712. const int empty_repeated_field_size = message.SpaceUsed(); \
  713. EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \
  714. message.AddExtension(unittest::repeated_##type##_extension, value); \
  715. message.AddExtension(unittest::repeated_##type##_extension, value); \
  716. EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type; \
  717. message.ClearExtension(unittest::repeated_##type##_extension); \
  718. const int old_capacity = \
  719. message.GetRepeatedExtension(unittest::repeated_##type##_extension) \
  720. .Capacity(); \
  721. EXPECT_GE(old_capacity, kMinRepeatedFieldAllocationSize); \
  722. for (int i = 0; i < 16; ++i) { \
  723. message.AddExtension(unittest::repeated_##type##_extension, value); \
  724. } \
  725. int expected_size = \
  726. sizeof(cpptype) * \
  727. (message \
  728. .GetRepeatedExtension(unittest::repeated_##type##_extension) \
  729. .Capacity() - \
  730. old_capacity) + \
  731. empty_repeated_field_size; \
  732. EXPECT_LE(expected_size, message.SpaceUsed()) << #type; \
  733. } while (0)
  734. TEST_REPEATED_EXTENSIONS_SPACE_USED(int32, int32, 101);
  735. TEST_REPEATED_EXTENSIONS_SPACE_USED(int64, int64, 102);
  736. TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32, uint32, 103);
  737. TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64, uint64, 104);
  738. TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32, int32, 105);
  739. TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64, int64, 106);
  740. TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32, uint32, 107);
  741. TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64, uint64, 108);
  742. TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed32, int32, 109);
  743. TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed64, int64, 110);
  744. TEST_REPEATED_EXTENSIONS_SPACE_USED(float, float, 111);
  745. TEST_REPEATED_EXTENSIONS_SPACE_USED(double, double, 112);
  746. TEST_REPEATED_EXTENSIONS_SPACE_USED(bool, bool, true);
  747. TEST_REPEATED_EXTENSIONS_SPACE_USED(nested_enum, int,
  748. unittest::TestAllTypes::FOO);
  749. #undef TEST_REPEATED_EXTENSIONS_SPACE_USED
  750. // Repeated strings
  751. {
  752. unittest::TestAllExtensions message;
  753. const int base_size = message.SpaceUsed();
  754. int min_expected_size = sizeof(RepeatedPtrField<std::string>) + base_size;
  755. const std::string value(256, 'x');
  756. // Once items are allocated, they may stick around even when cleared so
  757. // without the hardcore memory management accessors there isn't a notion of
  758. // the empty repeated field memory usage as there is with primitive types.
  759. for (int i = 0; i < 16; ++i) {
  760. message.AddExtension(unittest::repeated_string_extension, value);
  761. }
  762. min_expected_size +=
  763. (sizeof(value) + value.size()) * (16 - kMinRepeatedFieldAllocationSize);
  764. EXPECT_LE(min_expected_size, message.SpaceUsed());
  765. }
  766. // Repeated messages
  767. {
  768. unittest::TestAllExtensions message;
  769. const int base_size = message.SpaceUsed();
  770. int min_expected_size =
  771. sizeof(RepeatedPtrField<unittest::ForeignMessage>) + base_size;
  772. unittest::ForeignMessage prototype;
  773. prototype.set_c(2);
  774. for (int i = 0; i < 16; ++i) {
  775. message.AddExtension(unittest::repeated_foreign_message_extension)
  776. ->CopyFrom(prototype);
  777. }
  778. min_expected_size +=
  779. (16 - kMinRepeatedFieldAllocationSize) * prototype.SpaceUsed();
  780. EXPECT_LE(min_expected_size, message.SpaceUsed());
  781. }
  782. }
  783. // N.B.: We do not test range-based for here because we remain C++03 compatible.
  784. template <typename T, typename M, typename ID>
  785. inline T SumAllExtensions(const M& message, ID extension, T zero) {
  786. T sum = zero;
  787. typename RepeatedField<T>::const_iterator iter =
  788. message.GetRepeatedExtension(extension).begin();
  789. typename RepeatedField<T>::const_iterator end =
  790. message.GetRepeatedExtension(extension).end();
  791. for (; iter != end; ++iter) {
  792. sum += *iter;
  793. }
  794. return sum;
  795. }
  796. template <typename T, typename M, typename ID>
  797. inline void IncAllExtensions(M* message, ID extension, T val) {
  798. typename RepeatedField<T>::iterator iter =
  799. message->MutableRepeatedExtension(extension)->begin();
  800. typename RepeatedField<T>::iterator end =
  801. message->MutableRepeatedExtension(extension)->end();
  802. for (; iter != end; ++iter) {
  803. *iter += val;
  804. }
  805. }
  806. TEST(ExtensionSetTest, RepeatedFields) {
  807. unittest::TestAllExtensions message;
  808. // Test empty repeated-field case (b/12926163)
  809. ASSERT_EQ(
  810. 0,
  811. message.GetRepeatedExtension(unittest::repeated_int32_extension).size());
  812. ASSERT_EQ(
  813. 0, message.GetRepeatedExtension(unittest::repeated_nested_enum_extension)
  814. .size());
  815. ASSERT_EQ(
  816. 0,
  817. message.GetRepeatedExtension(unittest::repeated_string_extension).size());
  818. ASSERT_EQ(
  819. 0,
  820. message.GetRepeatedExtension(unittest::repeated_nested_message_extension)
  821. .size());
  822. unittest::TestAllTypes::NestedMessage nested_message;
  823. nested_message.set_bb(42);
  824. unittest::TestAllTypes::NestedEnum nested_enum =
  825. unittest::TestAllTypes::NestedEnum_MIN;
  826. for (int i = 0; i < 10; ++i) {
  827. message.AddExtension(unittest::repeated_int32_extension, 1);
  828. message.AddExtension(unittest::repeated_int64_extension, 2);
  829. message.AddExtension(unittest::repeated_uint32_extension, 3);
  830. message.AddExtension(unittest::repeated_uint64_extension, 4);
  831. message.AddExtension(unittest::repeated_sint32_extension, 5);
  832. message.AddExtension(unittest::repeated_sint64_extension, 6);
  833. message.AddExtension(unittest::repeated_fixed32_extension, 7);
  834. message.AddExtension(unittest::repeated_fixed64_extension, 8);
  835. message.AddExtension(unittest::repeated_sfixed32_extension, 7);
  836. message.AddExtension(unittest::repeated_sfixed64_extension, 8);
  837. message.AddExtension(unittest::repeated_float_extension, 9.0);
  838. message.AddExtension(unittest::repeated_double_extension, 10.0);
  839. message.AddExtension(unittest::repeated_bool_extension, true);
  840. message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum);
  841. message.AddExtension(unittest::repeated_string_extension,
  842. std::string("test"));
  843. message.AddExtension(unittest::repeated_bytes_extension,
  844. std::string("test\xFF"));
  845. message.AddExtension(unittest::repeated_nested_message_extension)
  846. ->CopyFrom(nested_message);
  847. message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum);
  848. }
  849. ASSERT_EQ(10, SumAllExtensions<int32>(message,
  850. unittest::repeated_int32_extension, 0));
  851. IncAllExtensions<int32>(&message, unittest::repeated_int32_extension, 1);
  852. ASSERT_EQ(20, SumAllExtensions<int32>(message,
  853. unittest::repeated_int32_extension, 0));
  854. ASSERT_EQ(20, SumAllExtensions<int64>(message,
  855. unittest::repeated_int64_extension, 0));
  856. IncAllExtensions<int64>(&message, unittest::repeated_int64_extension, 1);
  857. ASSERT_EQ(30, SumAllExtensions<int64>(message,
  858. unittest::repeated_int64_extension, 0));
  859. ASSERT_EQ(30, SumAllExtensions<uint32>(
  860. message, unittest::repeated_uint32_extension, 0));
  861. IncAllExtensions<uint32>(&message, unittest::repeated_uint32_extension, 1);
  862. ASSERT_EQ(40, SumAllExtensions<uint32>(
  863. message, unittest::repeated_uint32_extension, 0));
  864. ASSERT_EQ(40, SumAllExtensions<uint64>(
  865. message, unittest::repeated_uint64_extension, 0));
  866. IncAllExtensions<uint64>(&message, unittest::repeated_uint64_extension, 1);
  867. ASSERT_EQ(50, SumAllExtensions<uint64>(
  868. message, unittest::repeated_uint64_extension, 0));
  869. ASSERT_EQ(50, SumAllExtensions<int32>(
  870. message, unittest::repeated_sint32_extension, 0));
  871. IncAllExtensions<int32>(&message, unittest::repeated_sint32_extension, 1);
  872. ASSERT_EQ(60, SumAllExtensions<int32>(
  873. message, unittest::repeated_sint32_extension, 0));
  874. ASSERT_EQ(60, SumAllExtensions<int64>(
  875. message, unittest::repeated_sint64_extension, 0));
  876. IncAllExtensions<int64>(&message, unittest::repeated_sint64_extension, 1);
  877. ASSERT_EQ(70, SumAllExtensions<int64>(
  878. message, unittest::repeated_sint64_extension, 0));
  879. ASSERT_EQ(70, SumAllExtensions<uint32>(
  880. message, unittest::repeated_fixed32_extension, 0));
  881. IncAllExtensions<uint32>(&message, unittest::repeated_fixed32_extension, 1);
  882. ASSERT_EQ(80, SumAllExtensions<uint32>(
  883. message, unittest::repeated_fixed32_extension, 0));
  884. ASSERT_EQ(80, SumAllExtensions<uint64>(
  885. message, unittest::repeated_fixed64_extension, 0));
  886. IncAllExtensions<uint64>(&message, unittest::repeated_fixed64_extension, 1);
  887. ASSERT_EQ(90, SumAllExtensions<uint64>(
  888. message, unittest::repeated_fixed64_extension, 0));
  889. // Usually, floating-point arithmetic cannot be trusted to be exact, so it is
  890. // a Bad Idea to assert equality in a test like this. However, we're dealing
  891. // with integers with a small number of significant mantissa bits, so we
  892. // should actually have exact precision here.
  893. ASSERT_EQ(90, SumAllExtensions<float>(message,
  894. unittest::repeated_float_extension, 0));
  895. IncAllExtensions<float>(&message, unittest::repeated_float_extension, 1);
  896. ASSERT_EQ(100, SumAllExtensions<float>(
  897. message, unittest::repeated_float_extension, 0));
  898. ASSERT_EQ(100, SumAllExtensions<double>(
  899. message, unittest::repeated_double_extension, 0));
  900. IncAllExtensions<double>(&message, unittest::repeated_double_extension, 1);
  901. ASSERT_EQ(110, SumAllExtensions<double>(
  902. message, unittest::repeated_double_extension, 0));
  903. RepeatedPtrField<std::string>::iterator string_iter;
  904. RepeatedPtrField<std::string>::iterator string_end;
  905. for (string_iter =
  906. message
  907. .MutableRepeatedExtension(unittest::repeated_string_extension)
  908. ->begin(),
  909. string_end =
  910. message
  911. .MutableRepeatedExtension(unittest::repeated_string_extension)
  912. ->end();
  913. string_iter != string_end; ++string_iter) {
  914. *string_iter += "test";
  915. }
  916. RepeatedPtrField<std::string>::const_iterator string_const_iter;
  917. RepeatedPtrField<std::string>::const_iterator string_const_end;
  918. for (string_const_iter =
  919. message.GetRepeatedExtension(unittest::repeated_string_extension)
  920. .begin(),
  921. string_const_end =
  922. message.GetRepeatedExtension(unittest::repeated_string_extension)
  923. .end();
  924. string_iter != string_end; ++string_iter) {
  925. ASSERT_TRUE(*string_iter == "testtest");
  926. }
  927. RepeatedField<unittest::TestAllTypes_NestedEnum>::iterator enum_iter;
  928. RepeatedField<unittest::TestAllTypes_NestedEnum>::iterator enum_end;
  929. for (enum_iter = message
  930. .MutableRepeatedExtension(
  931. unittest::repeated_nested_enum_extension)
  932. ->begin(),
  933. enum_end = message
  934. .MutableRepeatedExtension(
  935. unittest::repeated_nested_enum_extension)
  936. ->end();
  937. enum_iter != enum_end; ++enum_iter) {
  938. *enum_iter = unittest::TestAllTypes::NestedEnum_MAX;
  939. }
  940. RepeatedField<unittest::TestAllTypes_NestedEnum>::const_iterator
  941. enum_const_iter;
  942. RepeatedField<unittest::TestAllTypes_NestedEnum>::const_iterator
  943. enum_const_end;
  944. for (enum_const_iter =
  945. message
  946. .GetRepeatedExtension(unittest::repeated_nested_enum_extension)
  947. .begin(),
  948. enum_const_end =
  949. message
  950. .GetRepeatedExtension(unittest::repeated_nested_enum_extension)
  951. .end();
  952. enum_const_iter != enum_const_end; ++enum_const_iter) {
  953. ASSERT_EQ(*enum_const_iter, unittest::TestAllTypes::NestedEnum_MAX);
  954. }
  955. RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::iterator msg_iter;
  956. RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::iterator msg_end;
  957. for (msg_iter = message
  958. .MutableRepeatedExtension(
  959. unittest::repeated_nested_message_extension)
  960. ->begin(),
  961. msg_end = message
  962. .MutableRepeatedExtension(
  963. unittest::repeated_nested_message_extension)
  964. ->end();
  965. msg_iter != msg_end; ++msg_iter) {
  966. msg_iter->set_bb(1234);
  967. }
  968. RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::const_iterator
  969. msg_const_iter;
  970. RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::const_iterator
  971. msg_const_end;
  972. for (msg_const_iter = message
  973. .GetRepeatedExtension(
  974. unittest::repeated_nested_message_extension)
  975. .begin(),
  976. msg_const_end = message
  977. .GetRepeatedExtension(
  978. unittest::repeated_nested_message_extension)
  979. .end();
  980. msg_const_iter != msg_const_end; ++msg_const_iter) {
  981. ASSERT_EQ(msg_const_iter->bb(), 1234);
  982. }
  983. // Test range-based for as well, but only if compiled as C++11.
  984. #if __cplusplus >= 201103L
  985. // Test one primitive field.
  986. for (auto& x :
  987. *message.MutableRepeatedExtension(unittest::repeated_int32_extension)) {
  988. x = 4321;
  989. }
  990. for (const auto& x :
  991. message.GetRepeatedExtension(unittest::repeated_int32_extension)) {
  992. ASSERT_EQ(x, 4321);
  993. }
  994. // Test one string field.
  995. for (auto& x :
  996. *message.MutableRepeatedExtension(unittest::repeated_string_extension)) {
  997. x = "test_range_based_for";
  998. }
  999. for (const auto& x :
  1000. message.GetRepeatedExtension(unittest::repeated_string_extension)) {
  1001. ASSERT_TRUE(x == "test_range_based_for");
  1002. }
  1003. // Test one message field.
  1004. for (auto& x : *message.MutableRepeatedExtension(
  1005. unittest::repeated_nested_message_extension)) {
  1006. x.set_bb(4321);
  1007. }
  1008. for (const auto& x : *message.MutableRepeatedExtension(
  1009. unittest::repeated_nested_message_extension)) {
  1010. ASSERT_EQ(x.bb(), 4321);
  1011. }
  1012. #endif
  1013. }
  1014. // From b/12926163
  1015. TEST(ExtensionSetTest, AbsentExtension) {
  1016. unittest::TestAllExtensions message;
  1017. message.MutableRepeatedExtension(unittest::repeated_nested_message_extension)
  1018. ->Add()
  1019. ->set_bb(123);
  1020. ASSERT_EQ(1,
  1021. message.ExtensionSize(unittest::repeated_nested_message_extension));
  1022. EXPECT_EQ(123,
  1023. message.GetExtension(unittest::repeated_nested_message_extension, 0)
  1024. .bb());
  1025. }
  1026. #ifdef PROTOBUF_HAS_DEATH_TEST
  1027. TEST(ExtensionSetTest, InvalidEnumDeath) {
  1028. unittest::TestAllExtensions message;
  1029. EXPECT_DEBUG_DEATH(
  1030. message.SetExtension(unittest::optional_foreign_enum_extension,
  1031. static_cast<unittest::ForeignEnum>(53)),
  1032. "IsValid");
  1033. }
  1034. #endif // PROTOBUF_HAS_DEATH_TEST
  1035. TEST(ExtensionSetTest, DynamicExtensions) {
  1036. // Test adding a dynamic extension to a compiled-in message object.
  1037. FileDescriptorProto dynamic_proto;
  1038. dynamic_proto.set_name("dynamic_extensions_test.proto");
  1039. dynamic_proto.add_dependency(
  1040. unittest::TestAllExtensions::descriptor()->file()->name());
  1041. dynamic_proto.set_package("dynamic_extensions");
  1042. // Copy the fields and nested types from TestDynamicExtensions into our new
  1043. // proto, converting the fields into extensions.
  1044. const Descriptor* template_descriptor =
  1045. unittest::TestDynamicExtensions::descriptor();
  1046. DescriptorProto template_descriptor_proto;
  1047. template_descriptor->CopyTo(&template_descriptor_proto);
  1048. dynamic_proto.mutable_message_type()->MergeFrom(
  1049. template_descriptor_proto.nested_type());
  1050. dynamic_proto.mutable_enum_type()->MergeFrom(
  1051. template_descriptor_proto.enum_type());
  1052. dynamic_proto.mutable_extension()->MergeFrom(
  1053. template_descriptor_proto.field());
  1054. // For each extension that we added...
  1055. for (int i = 0; i < dynamic_proto.extension_size(); i++) {
  1056. // Set its extendee to TestAllExtensions.
  1057. FieldDescriptorProto* extension = dynamic_proto.mutable_extension(i);
  1058. extension->set_extendee(
  1059. unittest::TestAllExtensions::descriptor()->full_name());
  1060. // If the field refers to one of the types nested in TestDynamicExtensions,
  1061. // make it refer to the type in our dynamic proto instead.
  1062. std::string prefix = "." + template_descriptor->full_name() + ".";
  1063. if (extension->has_type_name()) {
  1064. std::string* type_name = extension->mutable_type_name();
  1065. if (HasPrefixString(*type_name, prefix)) {
  1066. type_name->replace(0, prefix.size(), ".dynamic_extensions.");
  1067. }
  1068. }
  1069. }
  1070. // Now build the file, using the generated pool as an underlay.
  1071. DescriptorPool dynamic_pool(DescriptorPool::generated_pool());
  1072. const FileDescriptor* file = dynamic_pool.BuildFile(dynamic_proto);
  1073. ASSERT_TRUE(file != NULL);
  1074. DynamicMessageFactory dynamic_factory(&dynamic_pool);
  1075. dynamic_factory.SetDelegateToGeneratedFactory(true);
  1076. // Construct a message that we can parse with the extensions we defined.
  1077. // Since the extensions were based off of the fields of TestDynamicExtensions,
  1078. // we can use that message to create this test message.
  1079. std::string data;
  1080. unittest::TestDynamicExtensions dynamic_extension;
  1081. {
  1082. unittest::TestDynamicExtensions message;
  1083. message.set_scalar_extension(123);
  1084. message.set_enum_extension(unittest::FOREIGN_BAR);
  1085. message.set_dynamic_enum_extension(
  1086. unittest::TestDynamicExtensions::DYNAMIC_BAZ);
  1087. message.mutable_message_extension()->set_c(456);
  1088. message.mutable_dynamic_message_extension()->set_dynamic_field(789);
  1089. message.add_repeated_extension("foo");
  1090. message.add_repeated_extension("bar");
  1091. message.add_packed_extension(12);
  1092. message.add_packed_extension(-34);
  1093. message.add_packed_extension(56);
  1094. message.add_packed_extension(-78);
  1095. // Also add some unknown fields.
  1096. // An unknown enum value (for a known field).
  1097. message.mutable_unknown_fields()->AddVarint(
  1098. unittest::TestDynamicExtensions::kDynamicEnumExtensionFieldNumber,
  1099. 12345);
  1100. // A regular unknown field.
  1101. message.mutable_unknown_fields()->AddLengthDelimited(54321, "unknown");
  1102. message.SerializeToString(&data);
  1103. dynamic_extension = message;
  1104. }
  1105. // Now we can parse this using our dynamic extension definitions...
  1106. unittest::TestAllExtensions message;
  1107. {
  1108. io::ArrayInputStream raw_input(data.data(), data.size());
  1109. io::CodedInputStream input(&raw_input);
  1110. input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory);
  1111. ASSERT_TRUE(message.ParseFromCodedStream(&input));
  1112. ASSERT_TRUE(input.ConsumedEntireMessage());
  1113. }
  1114. // Can we print it?
  1115. EXPECT_EQ(
  1116. "[dynamic_extensions.scalar_extension]: 123\n"
  1117. "[dynamic_extensions.enum_extension]: FOREIGN_BAR\n"
  1118. "[dynamic_extensions.dynamic_enum_extension]: DYNAMIC_BAZ\n"
  1119. "[dynamic_extensions.message_extension] {\n"
  1120. " c: 456\n"
  1121. "}\n"
  1122. "[dynamic_extensions.dynamic_message_extension] {\n"
  1123. " dynamic_field: 789\n"
  1124. "}\n"
  1125. "[dynamic_extensions.repeated_extension]: \"foo\"\n"
  1126. "[dynamic_extensions.repeated_extension]: \"bar\"\n"
  1127. "[dynamic_extensions.packed_extension]: 12\n"
  1128. "[dynamic_extensions.packed_extension]: -34\n"
  1129. "[dynamic_extensions.packed_extension]: 56\n"
  1130. "[dynamic_extensions.packed_extension]: -78\n"
  1131. "2002: 12345\n"
  1132. "54321: \"unknown\"\n",
  1133. message.DebugString());
  1134. // Can we serialize it?
  1135. EXPECT_TRUE(
  1136. EqualsToSerialized(dynamic_extension, message.SerializeAsString()));
  1137. // What if we parse using the reflection-based parser?
  1138. {
  1139. unittest::TestAllExtensions message2;
  1140. io::ArrayInputStream raw_input(data.data(), data.size());
  1141. io::CodedInputStream input(&raw_input);
  1142. input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory);
  1143. ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message2));
  1144. ASSERT_TRUE(input.ConsumedEntireMessage());
  1145. EXPECT_EQ(message.DebugString(), message2.DebugString());
  1146. }
  1147. // Are the embedded generated types actually using the generated objects?
  1148. {
  1149. const FieldDescriptor* message_extension =
  1150. file->FindExtensionByName("message_extension");
  1151. ASSERT_TRUE(message_extension != NULL);
  1152. const Message& sub_message =
  1153. message.GetReflection()->GetMessage(message, message_extension);
  1154. const unittest::ForeignMessage* typed_sub_message =
  1155. #if PROTOBUF_RTTI
  1156. dynamic_cast<const unittest::ForeignMessage*>(&sub_message);
  1157. #else
  1158. static_cast<const unittest::ForeignMessage*>(&sub_message);
  1159. #endif
  1160. ASSERT_TRUE(typed_sub_message != NULL);
  1161. EXPECT_EQ(456, typed_sub_message->c());
  1162. }
  1163. // What does GetMessage() return for the embedded dynamic type if it isn't
  1164. // present?
  1165. {
  1166. const FieldDescriptor* dynamic_message_extension =
  1167. file->FindExtensionByName("dynamic_message_extension");
  1168. ASSERT_TRUE(dynamic_message_extension != NULL);
  1169. const Message& parent = unittest::TestAllExtensions::default_instance();
  1170. const Message& sub_message = parent.GetReflection()->GetMessage(
  1171. parent, dynamic_message_extension, &dynamic_factory);
  1172. const Message* prototype =
  1173. dynamic_factory.GetPrototype(dynamic_message_extension->message_type());
  1174. EXPECT_EQ(prototype, &sub_message);
  1175. }
  1176. }
  1177. } // namespace
  1178. } // namespace internal
  1179. } // namespace protobuf
  1180. } // namespace google