诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1461 regels
54 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. #include <google/protobuf/arena.h>
  31. #include <algorithm>
  32. #include <cstring>
  33. #include <memory>
  34. #include <string>
  35. #include <type_traits>
  36. #include <typeinfo>
  37. #include <vector>
  38. #include <google/protobuf/stubs/logging.h>
  39. #include <google/protobuf/stubs/common.h>
  40. #include <google/protobuf/arena_test_util.h>
  41. #include <google/protobuf/test_util.h>
  42. #include <google/protobuf/unittest.pb.h>
  43. #include <google/protobuf/unittest_arena.pb.h>
  44. #include <google/protobuf/unittest_no_arena.pb.h>
  45. #include <google/protobuf/io/coded_stream.h>
  46. #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
  47. #include <google/protobuf/descriptor.h>
  48. #include <google/protobuf/extension_set.h>
  49. #include <google/protobuf/message.h>
  50. #include <google/protobuf/message_lite.h>
  51. #include <google/protobuf/repeated_field.h>
  52. #include <google/protobuf/unknown_field_set.h>
  53. #include <google/protobuf/wire_format_lite.h>
  54. #include <gtest/gtest.h>
  55. #include <google/protobuf/stubs/strutil.h>
  56. using proto2_arena_unittest::ArenaMessage;
  57. using protobuf_unittest::TestAllExtensions;
  58. using protobuf_unittest::TestAllTypes;
  59. using protobuf_unittest::TestEmptyMessage;
  60. using protobuf_unittest::TestOneof2;
  61. using protobuf_unittest_no_arena::TestNoArenaMessage;
  62. namespace google {
  63. namespace protobuf {
  64. class Notifier {
  65. public:
  66. Notifier() : count_(0) {}
  67. void Notify() { count_++; }
  68. int GetCount() { return count_; }
  69. private:
  70. int count_;
  71. };
  72. class SimpleDataType {
  73. public:
  74. SimpleDataType() : notifier_(NULL) {}
  75. void SetNotifier(Notifier* notifier) { notifier_ = notifier; }
  76. virtual ~SimpleDataType() {
  77. if (notifier_ != NULL) {
  78. notifier_->Notify();
  79. }
  80. };
  81. private:
  82. Notifier* notifier_;
  83. };
  84. // A simple class that does not allow copying and so cannot be used as a
  85. // parameter type without "const &".
  86. class PleaseDontCopyMe {
  87. public:
  88. explicit PleaseDontCopyMe(int value) : value_(value) {}
  89. int value() const { return value_; }
  90. private:
  91. int value_;
  92. GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PleaseDontCopyMe);
  93. };
  94. // A class that takes four different types as constructor arguments.
  95. class MustBeConstructedWithOneThroughFour {
  96. public:
  97. MustBeConstructedWithOneThroughFour(int one, const char* two,
  98. const std::string& three,
  99. const PleaseDontCopyMe* four)
  100. : one_(one), two_(two), three_(three), four_(four) {}
  101. int one_;
  102. const char* const two_;
  103. std::string three_;
  104. const PleaseDontCopyMe* four_;
  105. private:
  106. GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughFour);
  107. };
  108. // A class that takes eight different types as constructor arguments.
  109. class MustBeConstructedWithOneThroughEight {
  110. public:
  111. MustBeConstructedWithOneThroughEight(int one, const char* two,
  112. const std::string& three,
  113. const PleaseDontCopyMe* four, int five,
  114. const char* six,
  115. const std::string& seven,
  116. const std::string& eight)
  117. : one_(one),
  118. two_(two),
  119. three_(three),
  120. four_(four),
  121. five_(five),
  122. six_(six),
  123. seven_(seven),
  124. eight_(eight) {}
  125. int one_;
  126. const char* const two_;
  127. std::string three_;
  128. const PleaseDontCopyMe* four_;
  129. int five_;
  130. const char* const six_;
  131. std::string seven_;
  132. std::string eight_;
  133. private:
  134. GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughEight);
  135. };
  136. TEST(ArenaTest, ArenaConstructable) {
  137. EXPECT_TRUE(Arena::is_arena_constructable<TestAllTypes>::type::value);
  138. EXPECT_TRUE(Arena::is_arena_constructable<const TestAllTypes>::type::value);
  139. EXPECT_FALSE(Arena::is_arena_constructable<TestNoArenaMessage>::type::value);
  140. EXPECT_FALSE(Arena::is_arena_constructable<Arena>::type::value);
  141. }
  142. TEST(ArenaTest, DestructorSkippable) {
  143. EXPECT_TRUE(Arena::is_destructor_skippable<TestAllTypes>::type::value);
  144. EXPECT_TRUE(Arena::is_destructor_skippable<const TestAllTypes>::type::value);
  145. EXPECT_FALSE(Arena::is_destructor_skippable<TestNoArenaMessage>::type::value);
  146. EXPECT_FALSE(Arena::is_destructor_skippable<Arena>::type::value);
  147. }
  148. TEST(ArenaTest, BasicCreate) {
  149. Arena arena;
  150. EXPECT_TRUE(Arena::Create<int32>(&arena) != NULL);
  151. EXPECT_TRUE(Arena::Create<int64>(&arena) != NULL);
  152. EXPECT_TRUE(Arena::Create<float>(&arena) != NULL);
  153. EXPECT_TRUE(Arena::Create<double>(&arena) != NULL);
  154. EXPECT_TRUE(Arena::Create<std::string>(&arena) != NULL);
  155. arena.Own(new int32);
  156. arena.Own(new int64);
  157. arena.Own(new float);
  158. arena.Own(new double);
  159. arena.Own(new std::string);
  160. arena.Own<int>(NULL);
  161. Notifier notifier;
  162. SimpleDataType* data = Arena::Create<SimpleDataType>(&arena);
  163. data->SetNotifier(&notifier);
  164. data = new SimpleDataType;
  165. data->SetNotifier(&notifier);
  166. arena.Own(data);
  167. arena.Reset();
  168. EXPECT_EQ(2, notifier.GetCount());
  169. }
  170. TEST(ArenaTest, CreateAndConstCopy) {
  171. Arena arena;
  172. const std::string s("foo");
  173. const std::string* s_copy = Arena::Create<std::string>(&arena, s);
  174. EXPECT_TRUE(s_copy != NULL);
  175. EXPECT_EQ("foo", s);
  176. EXPECT_EQ("foo", *s_copy);
  177. }
  178. TEST(ArenaTest, CreateAndNonConstCopy) {
  179. Arena arena;
  180. std::string s("foo");
  181. const std::string* s_copy = Arena::Create<std::string>(&arena, s);
  182. EXPECT_TRUE(s_copy != NULL);
  183. EXPECT_EQ("foo", s);
  184. EXPECT_EQ("foo", *s_copy);
  185. }
  186. TEST(ArenaTest, CreateAndMove) {
  187. Arena arena;
  188. std::string s("foo");
  189. const std::string* s_move = Arena::Create<std::string>(&arena, std::move(s));
  190. EXPECT_TRUE(s_move != NULL);
  191. EXPECT_TRUE(s.empty()); // NOLINT
  192. EXPECT_EQ("foo", *s_move);
  193. }
  194. TEST(ArenaTest, CreateWithFourConstructorArguments) {
  195. Arena arena;
  196. const std::string three("3");
  197. const PleaseDontCopyMe four(4);
  198. const MustBeConstructedWithOneThroughFour* new_object =
  199. Arena::Create<MustBeConstructedWithOneThroughFour>(&arena, 1, "2", three,
  200. &four);
  201. EXPECT_TRUE(new_object != NULL);
  202. ASSERT_EQ(1, new_object->one_);
  203. ASSERT_STREQ("2", new_object->two_);
  204. ASSERT_EQ("3", new_object->three_);
  205. ASSERT_EQ(4, new_object->four_->value());
  206. }
  207. TEST(ArenaTest, CreateWithEightConstructorArguments) {
  208. Arena arena;
  209. const std::string three("3");
  210. const PleaseDontCopyMe four(4);
  211. const std::string seven("7");
  212. const std::string eight("8");
  213. const MustBeConstructedWithOneThroughEight* new_object =
  214. Arena::Create<MustBeConstructedWithOneThroughEight>(
  215. &arena, 1, "2", three, &four, 5, "6", seven, eight);
  216. EXPECT_TRUE(new_object != NULL);
  217. ASSERT_EQ(1, new_object->one_);
  218. ASSERT_STREQ("2", new_object->two_);
  219. ASSERT_EQ("3", new_object->three_);
  220. ASSERT_EQ(4, new_object->four_->value());
  221. ASSERT_EQ(5, new_object->five_);
  222. ASSERT_STREQ("6", new_object->six_);
  223. ASSERT_EQ("7", new_object->seven_);
  224. ASSERT_EQ("8", new_object->eight_);
  225. }
  226. class PleaseMoveMe {
  227. public:
  228. explicit PleaseMoveMe(const std::string& value) : value_(value) {}
  229. PleaseMoveMe(PleaseMoveMe&&) = default;
  230. PleaseMoveMe(const PleaseMoveMe&) = delete;
  231. const std::string& value() const { return value_; }
  232. private:
  233. std::string value_;
  234. };
  235. TEST(ArenaTest, CreateWithMoveArguments) {
  236. Arena arena;
  237. PleaseMoveMe one("1");
  238. const PleaseMoveMe* new_object =
  239. Arena::Create<PleaseMoveMe>(&arena, std::move(one));
  240. EXPECT_TRUE(new_object);
  241. ASSERT_EQ("1", new_object->value());
  242. }
  243. TEST(ArenaTest, InitialBlockTooSmall) {
  244. // Construct a small (64 byte) initial block of memory to be used by the
  245. // arena allocator; then, allocate an object which will not fit in the
  246. // initial block.
  247. std::vector<char> arena_block(96);
  248. ArenaOptions options;
  249. options.initial_block = &arena_block[0];
  250. options.initial_block_size = arena_block.size();
  251. Arena arena(options);
  252. char* p = Arena::CreateArray<char>(&arena, 96);
  253. uintptr_t allocation = reinterpret_cast<uintptr_t>(p);
  254. // Ensure that the arena allocator did not return memory pointing into the
  255. // initial block of memory.
  256. uintptr_t arena_start = reinterpret_cast<uintptr_t>(&arena_block[0]);
  257. uintptr_t arena_end = arena_start + arena_block.size();
  258. EXPECT_FALSE(allocation >= arena_start && allocation < arena_end);
  259. // Write to the memory we allocated; this should (but is not guaranteed to)
  260. // trigger a check for heap corruption if the object was allocated from the
  261. // initially-provided block.
  262. memset(p, '\0', 96);
  263. }
  264. TEST(ArenaTest, Parsing) {
  265. TestAllTypes original;
  266. TestUtil::SetAllFields(&original);
  267. // Test memory leak.
  268. Arena arena;
  269. TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
  270. arena_message->ParseFromString(original.SerializeAsString());
  271. TestUtil::ExpectAllFieldsSet(*arena_message);
  272. // Test that string fields have nul terminator bytes (earlier bug).
  273. EXPECT_EQ(strlen(original.optional_string().c_str()),
  274. strlen(arena_message->optional_string().c_str()));
  275. }
  276. TEST(ArenaTest, UnknownFields) {
  277. TestAllTypes original;
  278. TestUtil::SetAllFields(&original);
  279. // Test basic parsing into (populating) and reading out of unknown fields on
  280. // an arena.
  281. Arena arena;
  282. TestEmptyMessage* arena_message =
  283. Arena::CreateMessage<TestEmptyMessage>(&arena);
  284. arena_message->ParseFromString(original.SerializeAsString());
  285. TestAllTypes copied;
  286. copied.ParseFromString(arena_message->SerializeAsString());
  287. TestUtil::ExpectAllFieldsSet(copied);
  288. // Exercise UFS manual manipulation (setters).
  289. arena_message = Arena::CreateMessage<TestEmptyMessage>(&arena);
  290. arena_message->mutable_unknown_fields()->AddVarint(
  291. TestAllTypes::kOptionalInt32FieldNumber, 42);
  292. copied.Clear();
  293. copied.ParseFromString(arena_message->SerializeAsString());
  294. EXPECT_TRUE(copied.has_optional_int32());
  295. EXPECT_EQ(42, copied.optional_int32());
  296. // Exercise UFS swap path.
  297. TestEmptyMessage* arena_message_2 =
  298. Arena::CreateMessage<TestEmptyMessage>(&arena);
  299. arena_message_2->Swap(arena_message);
  300. copied.Clear();
  301. copied.ParseFromString(arena_message_2->SerializeAsString());
  302. EXPECT_TRUE(copied.has_optional_int32());
  303. EXPECT_EQ(42, copied.optional_int32());
  304. // Test field manipulation.
  305. TestEmptyMessage* arena_message_3 =
  306. Arena::CreateMessage<TestEmptyMessage>(&arena);
  307. arena_message_3->mutable_unknown_fields()->AddVarint(1000, 42);
  308. arena_message_3->mutable_unknown_fields()->AddFixed32(1001, 42);
  309. arena_message_3->mutable_unknown_fields()->AddFixed64(1002, 42);
  310. arena_message_3->mutable_unknown_fields()->AddLengthDelimited(1003);
  311. arena_message_3->mutable_unknown_fields()->DeleteSubrange(0, 2);
  312. arena_message_3->mutable_unknown_fields()->DeleteByNumber(1002);
  313. arena_message_3->mutable_unknown_fields()->DeleteByNumber(1003);
  314. EXPECT_TRUE(arena_message_3->unknown_fields().empty());
  315. }
  316. TEST(ArenaTest, Swap) {
  317. Arena arena1;
  318. Arena arena2;
  319. TestAllTypes* arena1_message;
  320. TestAllTypes* arena2_message;
  321. // Case 1: Swap(), no UFS on either message, both messages on different
  322. // arenas. Arena pointers should remain the same after swap.
  323. arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  324. arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  325. arena1_message->Swap(arena2_message);
  326. EXPECT_EQ(&arena1, arena1_message->GetArena());
  327. EXPECT_EQ(&arena2, arena2_message->GetArena());
  328. // Case 2: Swap(), UFS on one message, both messages on different arenas.
  329. arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  330. arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  331. arena1_message->mutable_unknown_fields()->AddVarint(1, 42);
  332. arena1_message->Swap(arena2_message);
  333. EXPECT_EQ(&arena1, arena1_message->GetArena());
  334. EXPECT_EQ(&arena2, arena2_message->GetArena());
  335. EXPECT_EQ(0, arena1_message->unknown_fields().field_count());
  336. EXPECT_EQ(1, arena2_message->unknown_fields().field_count());
  337. EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint());
  338. // Case 3: Swap(), UFS on both messages, both messages on different arenas.
  339. arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  340. arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  341. arena1_message->mutable_unknown_fields()->AddVarint(1, 42);
  342. arena2_message->mutable_unknown_fields()->AddVarint(2, 84);
  343. arena1_message->Swap(arena2_message);
  344. EXPECT_EQ(&arena1, arena1_message->GetArena());
  345. EXPECT_EQ(&arena2, arena2_message->GetArena());
  346. EXPECT_EQ(1, arena1_message->unknown_fields().field_count());
  347. EXPECT_EQ(1, arena2_message->unknown_fields().field_count());
  348. EXPECT_EQ(84, arena1_message->unknown_fields().field(0).varint());
  349. EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint());
  350. }
  351. TEST(ArenaTest, ReflectionSwapFields) {
  352. Arena arena1;
  353. Arena arena2;
  354. TestAllTypes* arena1_message;
  355. TestAllTypes* arena2_message;
  356. // Case 1: messages on different arenas, only one message is set.
  357. arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  358. arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  359. TestUtil::SetAllFields(arena1_message);
  360. const Reflection* reflection = arena1_message->GetReflection();
  361. std::vector<const FieldDescriptor*> fields;
  362. reflection->ListFields(*arena1_message, &fields);
  363. reflection->SwapFields(arena1_message, arena2_message, fields);
  364. EXPECT_EQ(&arena1, arena1_message->GetArena());
  365. EXPECT_EQ(&arena2, arena2_message->GetArena());
  366. std::string output;
  367. arena1_message->SerializeToString(&output);
  368. EXPECT_EQ(0, output.size());
  369. TestUtil::ExpectAllFieldsSet(*arena2_message);
  370. reflection->SwapFields(arena1_message, arena2_message, fields);
  371. arena2_message->SerializeToString(&output);
  372. EXPECT_EQ(0, output.size());
  373. TestUtil::ExpectAllFieldsSet(*arena1_message);
  374. // Case 2: messages on different arenas, both messages are set.
  375. arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  376. arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  377. TestUtil::SetAllFields(arena1_message);
  378. TestUtil::SetAllFields(arena2_message);
  379. reflection->SwapFields(arena1_message, arena2_message, fields);
  380. EXPECT_EQ(&arena1, arena1_message->GetArena());
  381. EXPECT_EQ(&arena2, arena2_message->GetArena());
  382. TestUtil::ExpectAllFieldsSet(*arena1_message);
  383. TestUtil::ExpectAllFieldsSet(*arena2_message);
  384. // Case 3: messages on different arenas with different lifetimes.
  385. arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  386. {
  387. Arena arena3;
  388. TestAllTypes* arena3_message = Arena::CreateMessage<TestAllTypes>(&arena3);
  389. TestUtil::SetAllFields(arena3_message);
  390. reflection->SwapFields(arena1_message, arena3_message, fields);
  391. }
  392. TestUtil::ExpectAllFieldsSet(*arena1_message);
  393. // Case 4: one message on arena, the other on heap.
  394. arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  395. TestAllTypes message;
  396. TestUtil::SetAllFields(arena1_message);
  397. reflection->SwapFields(arena1_message, &message, fields);
  398. EXPECT_EQ(&arena1, arena1_message->GetArena());
  399. EXPECT_EQ(nullptr, message.GetArena());
  400. arena1_message->SerializeToString(&output);
  401. EXPECT_EQ(0, output.size());
  402. TestUtil::ExpectAllFieldsSet(message);
  403. }
  404. TEST(ArenaTest, SetAllocatedMessage) {
  405. Arena arena;
  406. TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
  407. TestAllTypes::NestedMessage* nested = new TestAllTypes::NestedMessage;
  408. nested->set_bb(118);
  409. arena_message->set_allocated_optional_nested_message(nested);
  410. EXPECT_EQ(118, arena_message->optional_nested_message().bb());
  411. TestNoArenaMessage no_arena_message;
  412. EXPECT_FALSE(no_arena_message.has_arena_message());
  413. no_arena_message.set_allocated_arena_message(NULL);
  414. EXPECT_FALSE(no_arena_message.has_arena_message());
  415. no_arena_message.set_allocated_arena_message(new ArenaMessage);
  416. EXPECT_TRUE(no_arena_message.has_arena_message());
  417. }
  418. TEST(ArenaTest, ReleaseMessage) {
  419. Arena arena;
  420. TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
  421. arena_message->mutable_optional_nested_message()->set_bb(118);
  422. std::unique_ptr<TestAllTypes::NestedMessage> nested(
  423. arena_message->release_optional_nested_message());
  424. EXPECT_EQ(118, nested->bb());
  425. TestAllTypes::NestedMessage* released_null =
  426. arena_message->release_optional_nested_message();
  427. EXPECT_EQ(NULL, released_null);
  428. }
  429. TEST(ArenaTest, SetAllocatedString) {
  430. Arena arena;
  431. TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
  432. std::string* allocated_str = new std::string("hello");
  433. arena_message->set_allocated_optional_string(allocated_str);
  434. EXPECT_EQ("hello", arena_message->optional_string());
  435. }
  436. TEST(ArenaTest, ReleaseString) {
  437. Arena arena;
  438. TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
  439. arena_message->set_optional_string("hello");
  440. std::unique_ptr<std::string> released_str(
  441. arena_message->release_optional_string());
  442. EXPECT_EQ("hello", *released_str);
  443. // Test default value.
  444. }
  445. TEST(ArenaTest, SwapBetweenArenasWithAllFieldsSet) {
  446. Arena arena1;
  447. TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  448. {
  449. Arena arena2;
  450. TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  451. TestUtil::SetAllFields(arena2_message);
  452. arena2_message->Swap(arena1_message);
  453. std::string output;
  454. arena2_message->SerializeToString(&output);
  455. EXPECT_EQ(0, output.size());
  456. }
  457. TestUtil::ExpectAllFieldsSet(*arena1_message);
  458. }
  459. TEST(ArenaTest, SwapBetweenArenaAndNonArenaWithAllFieldsSet) {
  460. TestAllTypes non_arena_message;
  461. TestUtil::SetAllFields(&non_arena_message);
  462. {
  463. Arena arena2;
  464. TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  465. TestUtil::SetAllFields(arena2_message);
  466. arena2_message->Swap(&non_arena_message);
  467. TestUtil::ExpectAllFieldsSet(*arena2_message);
  468. TestUtil::ExpectAllFieldsSet(non_arena_message);
  469. }
  470. }
  471. TEST(ArenaTest, UnsafeArenaSwap) {
  472. Arena shared_arena;
  473. TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&shared_arena);
  474. TestAllTypes* message2 = Arena::CreateMessage<TestAllTypes>(&shared_arena);
  475. TestUtil::SetAllFields(message1);
  476. message1->UnsafeArenaSwap(message2);
  477. TestUtil::ExpectAllFieldsSet(*message2);
  478. }
  479. TEST(ArenaTest, SwapBetweenArenasUsingReflection) {
  480. Arena arena1;
  481. TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  482. {
  483. Arena arena2;
  484. TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  485. TestUtil::SetAllFields(arena2_message);
  486. const Reflection* r = arena2_message->GetReflection();
  487. r->Swap(arena1_message, arena2_message);
  488. std::string output;
  489. arena2_message->SerializeToString(&output);
  490. EXPECT_EQ(0, output.size());
  491. }
  492. TestUtil::ExpectAllFieldsSet(*arena1_message);
  493. }
  494. TEST(ArenaTest, SwapBetweenArenaAndNonArenaUsingReflection) {
  495. TestAllTypes non_arena_message;
  496. TestUtil::SetAllFields(&non_arena_message);
  497. {
  498. Arena arena2;
  499. TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
  500. TestUtil::SetAllFields(arena2_message);
  501. const Reflection* r = arena2_message->GetReflection();
  502. r->Swap(&non_arena_message, arena2_message);
  503. TestUtil::ExpectAllFieldsSet(*arena2_message);
  504. TestUtil::ExpectAllFieldsSet(non_arena_message);
  505. }
  506. }
  507. TEST(ArenaTest, ReleaseFromArenaMessageMakesCopy) {
  508. TestAllTypes::NestedMessage* nested_msg = NULL;
  509. std::string* nested_string = NULL;
  510. {
  511. Arena arena;
  512. TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
  513. arena_message->mutable_optional_nested_message()->set_bb(42);
  514. *arena_message->mutable_optional_string() = "Hello";
  515. nested_msg = arena_message->release_optional_nested_message();
  516. nested_string = arena_message->release_optional_string();
  517. }
  518. EXPECT_EQ(42, nested_msg->bb());
  519. EXPECT_EQ("Hello", *nested_string);
  520. delete nested_msg;
  521. delete nested_string;
  522. }
  523. #if PROTOBUF_RTTI
  524. TEST(ArenaTest, ReleaseFromArenaMessageUsingReflectionMakesCopy) {
  525. TestAllTypes::NestedMessage* nested_msg = NULL;
  526. // Note: no string: reflection API only supports releasing submessages.
  527. {
  528. Arena arena;
  529. TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
  530. arena_message->mutable_optional_nested_message()->set_bb(42);
  531. const Reflection* r = arena_message->GetReflection();
  532. const FieldDescriptor* f = arena_message->GetDescriptor()->FindFieldByName(
  533. "optional_nested_message");
  534. nested_msg = static_cast<TestAllTypes::NestedMessage*>(
  535. r->ReleaseMessage(arena_message, f));
  536. }
  537. EXPECT_EQ(42, nested_msg->bb());
  538. delete nested_msg;
  539. }
  540. #endif // PROTOBUF_RTTI
  541. TEST(ArenaTest, SetAllocatedAcrossArenas) {
  542. Arena arena1;
  543. TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  544. TestAllTypes::NestedMessage* heap_submessage =
  545. new TestAllTypes::NestedMessage();
  546. heap_submessage->set_bb(42);
  547. arena1_message->set_allocated_optional_nested_message(heap_submessage);
  548. // Should keep same object and add to arena's Own()-list.
  549. EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
  550. {
  551. Arena arena2;
  552. TestAllTypes::NestedMessage* arena2_submessage =
  553. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
  554. arena2_submessage->set_bb(42);
  555. arena1_message->set_allocated_optional_nested_message(arena2_submessage);
  556. EXPECT_NE(arena2_submessage,
  557. arena1_message->mutable_optional_nested_message());
  558. }
  559. TestAllTypes::NestedMessage* arena1_submessage =
  560. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
  561. arena1_submessage->set_bb(42);
  562. TestAllTypes* heap_message = new TestAllTypes;
  563. heap_message->set_allocated_optional_nested_message(arena1_submessage);
  564. EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
  565. delete heap_message;
  566. }
  567. TEST(ArenaTest, SetAllocatedAcrossArenasWithReflection) {
  568. // Same as above, with reflection.
  569. Arena arena1;
  570. TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  571. const Reflection* r = arena1_message->GetReflection();
  572. const Descriptor* d = arena1_message->GetDescriptor();
  573. const FieldDescriptor* msg_field =
  574. d->FindFieldByName("optional_nested_message");
  575. TestAllTypes::NestedMessage* heap_submessage =
  576. new TestAllTypes::NestedMessage();
  577. heap_submessage->set_bb(42);
  578. r->SetAllocatedMessage(arena1_message, heap_submessage, msg_field);
  579. // Should keep same object and add to arena's Own()-list.
  580. EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
  581. {
  582. Arena arena2;
  583. TestAllTypes::NestedMessage* arena2_submessage =
  584. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
  585. arena2_submessage->set_bb(42);
  586. r->SetAllocatedMessage(arena1_message, arena2_submessage, msg_field);
  587. EXPECT_NE(arena2_submessage,
  588. arena1_message->mutable_optional_nested_message());
  589. }
  590. TestAllTypes::NestedMessage* arena1_submessage =
  591. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
  592. arena1_submessage->set_bb(42);
  593. TestAllTypes* heap_message = new TestAllTypes;
  594. r->SetAllocatedMessage(heap_message, arena1_submessage, msg_field);
  595. EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
  596. delete heap_message;
  597. }
  598. TEST(ArenaTest, AddAllocatedWithReflection) {
  599. Arena arena1;
  600. ArenaMessage* arena1_message = Arena::CreateMessage<ArenaMessage>(&arena1);
  601. const Reflection* r = arena1_message->GetReflection();
  602. const Descriptor* d = arena1_message->GetDescriptor();
  603. const FieldDescriptor* fd =
  604. d->FindFieldByName("repeated_import_no_arena_message");
  605. // Message with cc_enable_arenas = false;
  606. r->AddMessage(arena1_message, fd);
  607. r->AddMessage(arena1_message, fd);
  608. r->AddMessage(arena1_message, fd);
  609. EXPECT_EQ(3, r->FieldSize(*arena1_message, fd));
  610. // Message with cc_enable_arenas = true;
  611. fd = d->FindFieldByName("repeated_nested_message");
  612. r->AddMessage(arena1_message, fd);
  613. r->AddMessage(arena1_message, fd);
  614. r->AddMessage(arena1_message, fd);
  615. EXPECT_EQ(3, r->FieldSize(*arena1_message, fd));
  616. }
  617. TEST(ArenaTest, RepeatedPtrFieldAddClearedTest) {
  618. {
  619. RepeatedPtrField<TestAllTypes> repeated_field;
  620. EXPECT_TRUE(repeated_field.empty());
  621. EXPECT_EQ(0, repeated_field.size());
  622. // Ownership is passed to repeated_field.
  623. TestAllTypes* cleared = new TestAllTypes();
  624. repeated_field.AddCleared(cleared);
  625. EXPECT_TRUE(repeated_field.empty());
  626. EXPECT_EQ(0, repeated_field.size());
  627. }
  628. {
  629. RepeatedPtrField<TestAllTypes> repeated_field;
  630. EXPECT_TRUE(repeated_field.empty());
  631. EXPECT_EQ(0, repeated_field.size());
  632. // Ownership is passed to repeated_field.
  633. TestAllTypes* cleared = new TestAllTypes();
  634. repeated_field.AddAllocated(cleared);
  635. EXPECT_FALSE(repeated_field.empty());
  636. EXPECT_EQ(1, repeated_field.size());
  637. }
  638. }
  639. TEST(ArenaTest, AddAllocatedToRepeatedField) {
  640. // Heap->arena case.
  641. Arena arena1;
  642. TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  643. for (int i = 0; i < 10; i++) {
  644. TestAllTypes::NestedMessage* heap_submessage =
  645. new TestAllTypes::NestedMessage();
  646. heap_submessage->set_bb(42);
  647. arena1_message->mutable_repeated_nested_message()->AddAllocated(
  648. heap_submessage);
  649. // Should not copy object -- will use arena_->Own().
  650. EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i));
  651. EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
  652. }
  653. // Arena1->Arena2 case.
  654. arena1_message->Clear();
  655. for (int i = 0; i < 10; i++) {
  656. Arena arena2;
  657. TestAllTypes::NestedMessage* arena2_submessage =
  658. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
  659. arena2_submessage->set_bb(42);
  660. arena1_message->mutable_repeated_nested_message()->AddAllocated(
  661. arena2_submessage);
  662. // Should copy object.
  663. EXPECT_NE(arena2_submessage, &arena1_message->repeated_nested_message(i));
  664. EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
  665. }
  666. // Arena->heap case.
  667. TestAllTypes* heap_message = new TestAllTypes();
  668. for (int i = 0; i < 10; i++) {
  669. Arena arena2;
  670. TestAllTypes::NestedMessage* arena2_submessage =
  671. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
  672. arena2_submessage->set_bb(42);
  673. heap_message->mutable_repeated_nested_message()->AddAllocated(
  674. arena2_submessage);
  675. // Should copy object.
  676. EXPECT_NE(arena2_submessage, &heap_message->repeated_nested_message(i));
  677. EXPECT_EQ(42, heap_message->repeated_nested_message(i).bb());
  678. }
  679. delete heap_message;
  680. // Heap-arena case for strings (which are not arena-allocated).
  681. arena1_message->Clear();
  682. for (int i = 0; i < 10; i++) {
  683. std::string* s = new std::string("Test");
  684. arena1_message->mutable_repeated_string()->AddAllocated(s);
  685. // Should not copy.
  686. EXPECT_EQ(s, &arena1_message->repeated_string(i));
  687. EXPECT_EQ("Test", arena1_message->repeated_string(i));
  688. }
  689. }
  690. TEST(ArenaTest, AddAllocatedToRepeatedFieldViaReflection) {
  691. // Heap->arena case.
  692. Arena arena1;
  693. TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
  694. const Reflection* r = arena1_message->GetReflection();
  695. const Descriptor* d = arena1_message->GetDescriptor();
  696. const FieldDescriptor* fd = d->FindFieldByName("repeated_nested_message");
  697. for (int i = 0; i < 10; i++) {
  698. TestAllTypes::NestedMessage* heap_submessage =
  699. new TestAllTypes::NestedMessage;
  700. heap_submessage->set_bb(42);
  701. r->AddAllocatedMessage(arena1_message, fd, heap_submessage);
  702. // Should not copy object -- will use arena_->Own().
  703. EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i));
  704. EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
  705. }
  706. // Arena1->Arena2 case.
  707. arena1_message->Clear();
  708. for (int i = 0; i < 10; i++) {
  709. Arena arena2;
  710. TestAllTypes::NestedMessage* arena2_submessage =
  711. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
  712. arena2_submessage->set_bb(42);
  713. r->AddAllocatedMessage(arena1_message, fd, arena2_submessage);
  714. // Should copy object.
  715. EXPECT_NE(arena2_submessage, &arena1_message->repeated_nested_message(i));
  716. EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
  717. }
  718. // Arena->heap case.
  719. TestAllTypes* heap_message = new TestAllTypes;
  720. for (int i = 0; i < 10; i++) {
  721. Arena arena2;
  722. TestAllTypes::NestedMessage* arena2_submessage =
  723. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
  724. arena2_submessage->set_bb(42);
  725. r->AddAllocatedMessage(heap_message, fd, arena2_submessage);
  726. // Should copy object.
  727. EXPECT_NE(arena2_submessage, &heap_message->repeated_nested_message(i));
  728. EXPECT_EQ(42, heap_message->repeated_nested_message(i).bb());
  729. }
  730. delete heap_message;
  731. }
  732. TEST(ArenaTest, ReleaseLastRepeatedField) {
  733. // Release from arena-allocated repeated field and ensure that returned object
  734. // is heap-allocated.
  735. Arena arena;
  736. TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
  737. for (int i = 0; i < 10; i++) {
  738. TestAllTypes::NestedMessage* nested =
  739. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena);
  740. nested->set_bb(42);
  741. arena_message->mutable_repeated_nested_message()->AddAllocated(nested);
  742. }
  743. for (int i = 0; i < 10; i++) {
  744. const TestAllTypes::NestedMessage* orig_submessage =
  745. &arena_message->repeated_nested_message(10 - 1 - i); // last element
  746. TestAllTypes::NestedMessage* released =
  747. arena_message->mutable_repeated_nested_message()->ReleaseLast();
  748. EXPECT_NE(released, orig_submessage);
  749. EXPECT_EQ(42, released->bb());
  750. delete released;
  751. }
  752. // Test UnsafeArenaReleaseLast().
  753. for (int i = 0; i < 10; i++) {
  754. TestAllTypes::NestedMessage* nested =
  755. Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena);
  756. nested->set_bb(42);
  757. arena_message->mutable_repeated_nested_message()->AddAllocated(nested);
  758. }
  759. for (int i = 0; i < 10; i++) {
  760. const TestAllTypes::NestedMessage* orig_submessage =
  761. &arena_message->repeated_nested_message(10 - 1 - i); // last element
  762. TestAllTypes::NestedMessage* released =
  763. arena_message->mutable_repeated_nested_message()
  764. ->UnsafeArenaReleaseLast();
  765. EXPECT_EQ(released, orig_submessage);
  766. EXPECT_EQ(42, released->bb());
  767. // no delete -- |released| is on the arena.
  768. }
  769. // Test string case as well. ReleaseLast() in this case must copy the
  770. // string, even though it was originally heap-allocated and its pointer
  771. // was simply appended to the repeated field's internal vector, because the
  772. // string was placed on the arena's destructor list and cannot be removed
  773. // from that list (so the arena permanently owns the original instance).
  774. arena_message->Clear();
  775. for (int i = 0; i < 10; i++) {
  776. std::string* s = new std::string("Test");
  777. arena_message->mutable_repeated_string()->AddAllocated(s);
  778. }
  779. for (int i = 0; i < 10; i++) {
  780. const std::string* orig_element =
  781. &arena_message->repeated_string(10 - 1 - i);
  782. std::string* released =
  783. arena_message->mutable_repeated_string()->ReleaseLast();
  784. EXPECT_NE(released, orig_element);
  785. EXPECT_EQ("Test", *released);
  786. delete released;
  787. }
  788. }
  789. TEST(ArenaTest, UnsafeArenaReleaseAdd) {
  790. // Use unsafe_arena_release() and unsafe_arena_set_allocated() to transfer an
  791. // arena-allocated string from one message to another.
  792. const char kContent[] = "Test content";
  793. Arena arena;
  794. TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&arena);
  795. TestAllTypes* message2 = Arena::CreateMessage<TestAllTypes>(&arena);
  796. std::string* arena_string = Arena::Create<std::string>(&arena);
  797. *arena_string = kContent;
  798. message1->unsafe_arena_set_allocated_optional_string(arena_string);
  799. message2->unsafe_arena_set_allocated_optional_string(
  800. message1->unsafe_arena_release_optional_string());
  801. EXPECT_EQ(kContent, message2->optional_string());
  802. }
  803. TEST(ArenaTest, UnsafeArenaAddAllocated) {
  804. Arena arena;
  805. TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
  806. for (int i = 0; i < 10; i++) {
  807. std::string* arena_string = Arena::Create<std::string>(&arena);
  808. message->mutable_repeated_string()->UnsafeArenaAddAllocated(arena_string);
  809. EXPECT_EQ(arena_string, message->mutable_repeated_string(i));
  810. }
  811. }
  812. TEST(ArenaTest, UnsafeArenaRelease) {
  813. Arena arena;
  814. TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
  815. std::string* s = new std::string("test string");
  816. message->unsafe_arena_set_allocated_optional_string(s);
  817. EXPECT_TRUE(message->has_optional_string());
  818. EXPECT_EQ("test string", message->optional_string());
  819. s = message->unsafe_arena_release_optional_string();
  820. EXPECT_FALSE(message->has_optional_string());
  821. delete s;
  822. s = new std::string("test string");
  823. message->unsafe_arena_set_allocated_oneof_string(s);
  824. EXPECT_TRUE(message->has_oneof_string());
  825. EXPECT_EQ("test string", message->oneof_string());
  826. s = message->unsafe_arena_release_oneof_string();
  827. EXPECT_FALSE(message->has_oneof_string());
  828. delete s;
  829. }
  830. TEST(ArenaTest, OneofMerge) {
  831. Arena arena;
  832. TestAllTypes* message0 = Arena::CreateMessage<TestAllTypes>(&arena);
  833. TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&arena);
  834. message0->unsafe_arena_set_allocated_oneof_string(new std::string("x"));
  835. ASSERT_TRUE(message0->has_oneof_string());
  836. message1->unsafe_arena_set_allocated_oneof_string(new std::string("y"));
  837. ASSERT_TRUE(message1->has_oneof_string());
  838. EXPECT_EQ("x", message0->oneof_string());
  839. EXPECT_EQ("y", message1->oneof_string());
  840. message0->MergeFrom(*message1);
  841. EXPECT_EQ("y", message0->oneof_string());
  842. EXPECT_EQ("y", message1->oneof_string());
  843. delete message0->unsafe_arena_release_oneof_string();
  844. delete message1->unsafe_arena_release_oneof_string();
  845. }
  846. TEST(ArenaTest, ArenaOneofReflection) {
  847. Arena arena;
  848. TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
  849. const Descriptor* desc = message->GetDescriptor();
  850. const Reflection* refl = message->GetReflection();
  851. const FieldDescriptor* string_field = desc->FindFieldByName("oneof_string");
  852. const FieldDescriptor* msg_field =
  853. desc->FindFieldByName("oneof_nested_message");
  854. const OneofDescriptor* oneof = desc->FindOneofByName("oneof_field");
  855. refl->SetString(message, string_field, "Test value");
  856. EXPECT_TRUE(refl->HasOneof(*message, oneof));
  857. refl->ClearOneof(message, oneof);
  858. EXPECT_FALSE(refl->HasOneof(*message, oneof));
  859. Message* submsg = refl->MutableMessage(message, msg_field);
  860. EXPECT_TRUE(refl->HasOneof(*message, oneof));
  861. refl->ClearOneof(message, oneof);
  862. EXPECT_FALSE(refl->HasOneof(*message, oneof));
  863. refl->MutableMessage(message, msg_field);
  864. EXPECT_TRUE(refl->HasOneof(*message, oneof));
  865. submsg = refl->ReleaseMessage(message, msg_field);
  866. EXPECT_FALSE(refl->HasOneof(*message, oneof));
  867. EXPECT_TRUE(submsg->GetArena() == NULL);
  868. delete submsg;
  869. }
  870. void TestSwapRepeatedField(Arena* arena1, Arena* arena2) {
  871. // Test "safe" (copying) semantics for direct Swap() on RepeatedPtrField
  872. // between arenas.
  873. RepeatedPtrField<TestAllTypes> field1(arena1);
  874. RepeatedPtrField<TestAllTypes> field2(arena2);
  875. for (int i = 0; i < 10; i++) {
  876. TestAllTypes* t = Arena::CreateMessage<TestAllTypes>(arena1);
  877. t->set_optional_string("field1");
  878. t->set_optional_int32(i);
  879. if (arena1 != NULL) {
  880. field1.UnsafeArenaAddAllocated(t);
  881. } else {
  882. field1.AddAllocated(t);
  883. }
  884. }
  885. for (int i = 0; i < 5; i++) {
  886. TestAllTypes* t = Arena::CreateMessage<TestAllTypes>(arena2);
  887. t->set_optional_string("field2");
  888. t->set_optional_int32(i);
  889. if (arena2 != NULL) {
  890. field2.UnsafeArenaAddAllocated(t);
  891. } else {
  892. field2.AddAllocated(t);
  893. }
  894. }
  895. field1.Swap(&field2);
  896. EXPECT_EQ(5, field1.size());
  897. EXPECT_EQ(10, field2.size());
  898. EXPECT_TRUE(std::string("field1") == field2.Get(0).optional_string());
  899. EXPECT_TRUE(std::string("field2") == field1.Get(0).optional_string());
  900. // Ensure that fields retained their original order:
  901. for (int i = 0; i < field1.size(); i++) {
  902. EXPECT_EQ(i, field1.Get(i).optional_int32());
  903. }
  904. for (int i = 0; i < field2.size(); i++) {
  905. EXPECT_EQ(i, field2.Get(i).optional_int32());
  906. }
  907. }
  908. TEST(ArenaTest, SwapRepeatedField) {
  909. Arena arena;
  910. TestSwapRepeatedField(&arena, &arena);
  911. }
  912. TEST(ArenaTest, SwapRepeatedFieldWithDifferentArenas) {
  913. Arena arena1;
  914. Arena arena2;
  915. TestSwapRepeatedField(&arena1, &arena2);
  916. }
  917. TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnRightHandSide) {
  918. Arena arena;
  919. TestSwapRepeatedField(&arena, NULL);
  920. }
  921. TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnLeftHandSide) {
  922. Arena arena;
  923. TestSwapRepeatedField(NULL, &arena);
  924. }
  925. TEST(ArenaTest, ExtensionsOnArena) {
  926. Arena arena;
  927. // Ensure no leaks.
  928. TestAllExtensions* message_ext =
  929. Arena::CreateMessage<TestAllExtensions>(&arena);
  930. message_ext->SetExtension(protobuf_unittest::optional_int32_extension, 42);
  931. message_ext->SetExtension(protobuf_unittest::optional_string_extension,
  932. std::string("test"));
  933. message_ext
  934. ->MutableExtension(protobuf_unittest::optional_nested_message_extension)
  935. ->set_bb(42);
  936. }
  937. TEST(ArenaTest, RepeatedFieldOnArena) {
  938. // Preallocate an initial arena block to avoid mallocs during hooked region.
  939. std::vector<char> arena_block(1024 * 1024);
  940. ArenaOptions options;
  941. options.initial_block = &arena_block[0];
  942. options.initial_block_size = arena_block.size();
  943. Arena arena(options);
  944. {
  945. internal::NoHeapChecker no_heap;
  946. // Fill some repeated fields on the arena to test for leaks. Also verify no
  947. // memory allocations.
  948. RepeatedField<int32> repeated_int32(&arena);
  949. RepeatedPtrField<TestAllTypes> repeated_message(&arena);
  950. for (int i = 0; i < 100; i++) {
  951. repeated_int32.Add(42);
  952. repeated_message.Add()->set_optional_int32(42);
  953. EXPECT_EQ(&arena, repeated_message.Get(0).GetArena());
  954. const TestAllTypes* msg_in_repeated_field = &repeated_message.Get(0);
  955. TestAllTypes* msg = repeated_message.UnsafeArenaReleaseLast();
  956. EXPECT_EQ(msg_in_repeated_field, msg);
  957. }
  958. // UnsafeArenaExtractSubrange (i) should not leak and (ii) should return
  959. // on-arena pointers.
  960. for (int i = 0; i < 10; i++) {
  961. repeated_message.Add()->set_optional_int32(42);
  962. }
  963. TestAllTypes* extracted_messages[5];
  964. repeated_message.UnsafeArenaExtractSubrange(0, 5, extracted_messages);
  965. EXPECT_EQ(&arena, repeated_message.Get(0).GetArena());
  966. EXPECT_EQ(5, repeated_message.size());
  967. }
  968. // Now, outside the scope of the NoHeapChecker, test ExtractSubrange's copying
  969. // semantics.
  970. {
  971. RepeatedPtrField<TestAllTypes> repeated_message(&arena);
  972. for (int i = 0; i < 100; i++) {
  973. repeated_message.Add()->set_optional_int32(42);
  974. }
  975. TestAllTypes* extracted_messages[5];
  976. // ExtractSubrange should copy to the heap.
  977. repeated_message.ExtractSubrange(0, 5, extracted_messages);
  978. EXPECT_EQ(NULL, extracted_messages[0]->GetArena());
  979. // We need to free the heap-allocated messages to prevent a leak.
  980. for (int i = 0; i < 5; i++) {
  981. delete extracted_messages[i];
  982. extracted_messages[i] = NULL;
  983. }
  984. }
  985. // Now check that we can create RepeatedFields/RepeatedPtrFields themselves on
  986. // the arena. They have the necessary type traits so that they can behave like
  987. // messages in this way. This is useful for higher-level generic templated
  988. // code that may allocate messages or repeated fields of messages on an arena.
  989. {
  990. RepeatedPtrField<TestAllTypes>* repeated_ptr_on_arena =
  991. Arena::CreateMessage<RepeatedPtrField<TestAllTypes> >(&arena);
  992. for (int i = 0; i < 10; i++) {
  993. // Add some elements and let the leak-checker ensure that everything is
  994. // freed.
  995. repeated_ptr_on_arena->Add();
  996. }
  997. RepeatedField<int>* repeated_int_on_arena =
  998. Arena::CreateMessage<RepeatedField<int> >(&arena);
  999. for (int i = 0; i < 100; i++) {
  1000. repeated_int_on_arena->Add(i);
  1001. }
  1002. }
  1003. arena.Reset();
  1004. }
  1005. #if PROTOBUF_RTTI
  1006. TEST(ArenaTest, MutableMessageReflection) {
  1007. Arena arena;
  1008. TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
  1009. const Reflection* r = message->GetReflection();
  1010. const Descriptor* d = message->GetDescriptor();
  1011. const FieldDescriptor* field = d->FindFieldByName("optional_nested_message");
  1012. TestAllTypes::NestedMessage* submessage =
  1013. static_cast<TestAllTypes::NestedMessage*>(
  1014. r->MutableMessage(message, field));
  1015. TestAllTypes::NestedMessage* submessage_expected =
  1016. message->mutable_optional_nested_message();
  1017. EXPECT_EQ(submessage_expected, submessage);
  1018. EXPECT_EQ(&arena, submessage->GetArena());
  1019. const FieldDescriptor* oneof_field =
  1020. d->FindFieldByName("oneof_nested_message");
  1021. submessage = static_cast<TestAllTypes::NestedMessage*>(
  1022. r->MutableMessage(message, oneof_field));
  1023. submessage_expected = message->mutable_oneof_nested_message();
  1024. EXPECT_EQ(submessage_expected, submessage);
  1025. EXPECT_EQ(&arena, submessage->GetArena());
  1026. }
  1027. #endif // PROTOBUF_RTTI
  1028. void FillArenaAwareFields(TestAllTypes* message) {
  1029. std::string test_string = "hello world";
  1030. message->set_optional_int32(42);
  1031. message->set_optional_string(test_string);
  1032. message->set_optional_bytes(test_string);
  1033. message->mutable_optional_nested_message()->set_bb(42);
  1034. message->set_oneof_uint32(42);
  1035. message->mutable_oneof_nested_message()->set_bb(42);
  1036. message->set_oneof_string(test_string);
  1037. message->set_oneof_bytes(test_string);
  1038. message->add_repeated_int32(42);
  1039. // No repeated string: not yet arena-aware.
  1040. message->add_repeated_nested_message()->set_bb(42);
  1041. message->mutable_optional_lazy_message()->set_bb(42);
  1042. }
  1043. // Test: no allocations occur on heap while touching all supported field types.
  1044. TEST(ArenaTest, NoHeapAllocationsTest) {
  1045. // Allocate a large initial block to avoid mallocs during hooked test.
  1046. std::vector<char> arena_block(128 * 1024);
  1047. ArenaOptions options;
  1048. options.initial_block = &arena_block[0];
  1049. options.initial_block_size = arena_block.size();
  1050. Arena arena(options);
  1051. {
  1052. TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
  1053. FillArenaAwareFields(message);
  1054. }
  1055. arena.Reset();
  1056. }
  1057. TEST(ArenaTest, ParseCorruptedString) {
  1058. TestAllTypes message;
  1059. TestUtil::SetAllFields(&message);
  1060. TestParseCorruptedString<TestAllTypes, true>(message);
  1061. TestParseCorruptedString<TestAllTypes, false>(message);
  1062. }
  1063. #if PROTOBUF_RTTI
  1064. // Test construction on an arena via generic MessageLite interface. We should be
  1065. // able to successfully deserialize on the arena without incurring heap
  1066. // allocations, i.e., everything should still be arena-allocation-aware.
  1067. TEST(ArenaTest, MessageLiteOnArena) {
  1068. std::vector<char> arena_block(128 * 1024);
  1069. ArenaOptions options;
  1070. options.initial_block = &arena_block[0];
  1071. options.initial_block_size = arena_block.size();
  1072. Arena arena(options);
  1073. const MessageLite* prototype = &TestAllTypes::default_instance();
  1074. TestAllTypes initial_message;
  1075. FillArenaAwareFields(&initial_message);
  1076. std::string serialized;
  1077. initial_message.SerializeToString(&serialized);
  1078. {
  1079. MessageLite* generic_message = prototype->New(&arena);
  1080. EXPECT_TRUE(generic_message != NULL);
  1081. EXPECT_EQ(&arena, generic_message->GetArena());
  1082. EXPECT_TRUE(generic_message->ParseFromString(serialized));
  1083. TestAllTypes* deserialized = static_cast<TestAllTypes*>(generic_message);
  1084. EXPECT_EQ(42, deserialized->optional_int32());
  1085. }
  1086. arena.Reset();
  1087. }
  1088. #endif // PROTOBUF_RTTI
  1089. // RepeatedField should support non-POD types, and invoke constructors and
  1090. // destructors appropriately, because it's used this way by lots of other code
  1091. // (even if this was not its original intent).
  1092. TEST(ArenaTest, RepeatedFieldWithNonPODType) {
  1093. {
  1094. RepeatedField<std::string> field_on_heap;
  1095. for (int i = 0; i < 100; i++) {
  1096. *field_on_heap.Add() = "test string long enough to exceed inline buffer";
  1097. }
  1098. }
  1099. {
  1100. Arena arena;
  1101. RepeatedField<std::string> field_on_arena(&arena);
  1102. for (int i = 0; i < 100; i++) {
  1103. *field_on_arena.Add() = "test string long enough to exceed inline buffer";
  1104. }
  1105. }
  1106. }
  1107. // Align n to next multiple of 8
  1108. uint64 Align8(uint64 n) { return (n + 7) & -8; }
  1109. TEST(ArenaTest, SpaceAllocated_and_Used) {
  1110. ArenaOptions options;
  1111. options.start_block_size = 256;
  1112. options.max_block_size = 8192;
  1113. Arena arena_1(options);
  1114. EXPECT_EQ(0, arena_1.SpaceAllocated());
  1115. EXPECT_EQ(0, arena_1.SpaceUsed());
  1116. EXPECT_EQ(0, arena_1.Reset());
  1117. Arena::CreateArray<char>(&arena_1, 320);
  1118. // Arena will allocate slightly more than 320 for the block headers.
  1119. EXPECT_LE(320, arena_1.SpaceAllocated());
  1120. EXPECT_EQ(Align8(320), arena_1.SpaceUsed());
  1121. EXPECT_LE(320, arena_1.Reset());
  1122. // Test with initial block.
  1123. std::vector<char> arena_block(1024);
  1124. options.initial_block = &arena_block[0];
  1125. options.initial_block_size = arena_block.size();
  1126. Arena arena_2(options);
  1127. EXPECT_EQ(1024, arena_2.SpaceAllocated());
  1128. EXPECT_EQ(0, arena_2.SpaceUsed());
  1129. EXPECT_EQ(1024, arena_2.Reset());
  1130. Arena::CreateArray<char>(&arena_2, 55);
  1131. EXPECT_EQ(1024, arena_2.SpaceAllocated());
  1132. EXPECT_EQ(Align8(55), arena_2.SpaceUsed());
  1133. EXPECT_EQ(1024, arena_2.Reset());
  1134. // Reset options to test doubling policy explicitly.
  1135. options.initial_block = NULL;
  1136. options.initial_block_size = 0;
  1137. Arena arena_3(options);
  1138. EXPECT_EQ(0, arena_3.SpaceUsed());
  1139. Arena::CreateArray<char>(&arena_3, 160);
  1140. EXPECT_EQ(256, arena_3.SpaceAllocated());
  1141. EXPECT_EQ(Align8(160), arena_3.SpaceUsed());
  1142. Arena::CreateArray<char>(&arena_3, 70);
  1143. EXPECT_EQ(256 + 512, arena_3.SpaceAllocated());
  1144. EXPECT_EQ(Align8(160) + Align8(70), arena_3.SpaceUsed());
  1145. EXPECT_EQ(256 + 512, arena_3.Reset());
  1146. }
  1147. TEST(ArenaTest, Alignment) {
  1148. Arena arena;
  1149. for (int i = 0; i < 200; i++) {
  1150. void* p = Arena::CreateArray<char>(&arena, i);
  1151. GOOGLE_CHECK_EQ(reinterpret_cast<uintptr_t>(p) % 8, 0) << i << ": " << p;
  1152. }
  1153. }
  1154. TEST(ArenaTest, BlockSizeSmallerThanAllocation) {
  1155. for (size_t i = 0; i <= 8; ++i) {
  1156. ArenaOptions opt;
  1157. opt.start_block_size = opt.max_block_size = i;
  1158. Arena arena(opt);
  1159. *Arena::Create<int64>(&arena) = 42;
  1160. EXPECT_GE(arena.SpaceAllocated(), 8);
  1161. EXPECT_EQ(8, arena.SpaceUsed());
  1162. *Arena::Create<int64>(&arena) = 42;
  1163. EXPECT_GE(arena.SpaceAllocated(), 16);
  1164. EXPECT_EQ(16, arena.SpaceUsed());
  1165. }
  1166. }
  1167. TEST(ArenaTest, GetArenaShouldReturnTheArenaForArenaAllocatedMessages) {
  1168. Arena arena;
  1169. ArenaMessage* message = Arena::CreateMessage<ArenaMessage>(&arena);
  1170. const ArenaMessage* const_pointer_to_message = message;
  1171. EXPECT_EQ(&arena, Arena::GetArena(message));
  1172. EXPECT_EQ(&arena, Arena::GetArena(const_pointer_to_message));
  1173. // Test that the Message* / MessageLite* specialization SFINAE works.
  1174. const Message* const_pointer_to_message_type = message;
  1175. EXPECT_EQ(&arena, Arena::GetArena(const_pointer_to_message_type));
  1176. const MessageLite* const_pointer_to_message_lite_type = message;
  1177. EXPECT_EQ(&arena, Arena::GetArena(const_pointer_to_message_lite_type));
  1178. }
  1179. TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaAllocatedMessages) {
  1180. ArenaMessage message;
  1181. const ArenaMessage* const_pointer_to_message = &message;
  1182. EXPECT_EQ(NULL, Arena::GetArena(&message));
  1183. EXPECT_EQ(NULL, Arena::GetArena(const_pointer_to_message));
  1184. }
  1185. TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaCompatibleTypes) {
  1186. TestNoArenaMessage message;
  1187. const TestNoArenaMessage* const_pointer_to_message = &message;
  1188. EXPECT_EQ(nullptr, Arena::GetArena(&message));
  1189. EXPECT_EQ(nullptr, Arena::GetArena(const_pointer_to_message));
  1190. // Test that GetArena returns nullptr for types that have a GetArena method
  1191. // that doesn't return Arena*.
  1192. struct {
  1193. int GetArena() const { return 0; }
  1194. } has_get_arena_method_wrong_return_type;
  1195. EXPECT_EQ(nullptr, Arena::GetArena(&has_get_arena_method_wrong_return_type));
  1196. // Test that GetArena returns nullptr for types that have a GetArena alias.
  1197. struct {
  1198. using GetArena = Arena*;
  1199. GetArena unused;
  1200. } has_get_arena_alias;
  1201. EXPECT_EQ(nullptr, Arena::GetArena(&has_get_arena_alias));
  1202. // Test that GetArena returns nullptr for types that have a GetArena data
  1203. // member.
  1204. struct {
  1205. Arena GetArena;
  1206. } has_get_arena_data_member;
  1207. EXPECT_EQ(nullptr, Arena::GetArena(&has_get_arena_data_member));
  1208. }
  1209. TEST(ArenaTest, AddCleanup) {
  1210. Arena arena;
  1211. for (int i = 0; i < 100; i++) {
  1212. arena.Own(new int);
  1213. }
  1214. }
  1215. TEST(ArenaTest, UnsafeSetAllocatedOnArena) {
  1216. Arena arena;
  1217. TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
  1218. EXPECT_FALSE(message->has_optional_string());
  1219. std::string owned_string = "test with long enough content to heap-allocate";
  1220. message->unsafe_arena_set_allocated_optional_string(&owned_string);
  1221. EXPECT_TRUE(message->has_optional_string());
  1222. message->unsafe_arena_set_allocated_optional_string(NULL);
  1223. EXPECT_FALSE(message->has_optional_string());
  1224. }
  1225. // A helper utility class to only contain static hook functions, some
  1226. // counters to be used to verify the counters have been called and a cookie
  1227. // value to be verified.
  1228. class ArenaHooksTestUtil {
  1229. public:
  1230. static void* on_init(Arena* arena) {
  1231. ++num_init;
  1232. int* cookie = new int(kCookieValue);
  1233. return static_cast<void*>(cookie);
  1234. }
  1235. static void on_allocation(const std::type_info* /*unused*/, uint64 alloc_size,
  1236. void* cookie) {
  1237. ++num_allocations;
  1238. int cookie_value = *static_cast<int*>(cookie);
  1239. EXPECT_EQ(kCookieValue, cookie_value);
  1240. }
  1241. static void on_reset(Arena* arena, void* cookie, uint64 space_used) {
  1242. ++num_reset;
  1243. int cookie_value = *static_cast<int*>(cookie);
  1244. EXPECT_EQ(kCookieValue, cookie_value);
  1245. }
  1246. static void on_destruction(Arena* arena, void* cookie, uint64 space_used) {
  1247. ++num_destruct;
  1248. int cookie_value = *static_cast<int*>(cookie);
  1249. EXPECT_EQ(kCookieValue, cookie_value);
  1250. delete static_cast<int*>(cookie);
  1251. }
  1252. static const int kCookieValue = 999;
  1253. static uint32 num_init;
  1254. static uint32 num_allocations;
  1255. static uint32 num_reset;
  1256. static uint32 num_destruct;
  1257. };
  1258. uint32 ArenaHooksTestUtil::num_init = 0;
  1259. uint32 ArenaHooksTestUtil::num_allocations = 0;
  1260. uint32 ArenaHooksTestUtil::num_reset = 0;
  1261. uint32 ArenaHooksTestUtil::num_destruct = 0;
  1262. const int ArenaHooksTestUtil::kCookieValue;
  1263. class ArenaOptionsTestFriend {
  1264. public:
  1265. static void Set(ArenaOptions* options) {
  1266. options->on_arena_init = ArenaHooksTestUtil::on_init;
  1267. options->on_arena_allocation = ArenaHooksTestUtil::on_allocation;
  1268. options->on_arena_reset = ArenaHooksTestUtil::on_reset;
  1269. options->on_arena_destruction = ArenaHooksTestUtil::on_destruction;
  1270. }
  1271. };
  1272. // Test the hooks are correctly called and that the cookie is passed.
  1273. TEST(ArenaTest, ArenaHooksSanity) {
  1274. ArenaOptions options;
  1275. ArenaOptionsTestFriend::Set(&options);
  1276. // Scope for defining the arena
  1277. {
  1278. Arena arena(options);
  1279. EXPECT_EQ(1, ArenaHooksTestUtil::num_init);
  1280. EXPECT_EQ(0, ArenaHooksTestUtil::num_allocations);
  1281. Arena::Create<uint64>(&arena);
  1282. if (std::is_trivially_destructible<uint64>::value) {
  1283. EXPECT_EQ(1, ArenaHooksTestUtil::num_allocations);
  1284. } else {
  1285. EXPECT_EQ(2, ArenaHooksTestUtil::num_allocations);
  1286. }
  1287. arena.Reset();
  1288. arena.Reset();
  1289. EXPECT_EQ(2, ArenaHooksTestUtil::num_reset);
  1290. }
  1291. EXPECT_EQ(3, ArenaHooksTestUtil::num_reset);
  1292. EXPECT_EQ(1, ArenaHooksTestUtil::num_destruct);
  1293. }
  1294. } // namespace protobuf
  1295. } // namespace google