protobuf/src/google/protobuf/arena_unittest.cc
Go to the documentation of this file.
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 
31 #include <google/protobuf/arena.h>
32 
33 #include <algorithm>
34 #include <cstddef>
35 #include <cstring>
36 #include <memory>
37 #include <string>
38 #include <type_traits>
39 #include <typeinfo>
40 #include <vector>
41 
42 #include <google/protobuf/stubs/logging.h>
43 #include <google/protobuf/stubs/common.h>
44 #include <google/protobuf/arena_test_util.h>
45 #include <google/protobuf/test_util.h>
46 #include <google/protobuf/unittest.pb.h>
47 #include <google/protobuf/unittest_arena.pb.h>
48 #include <google/protobuf/io/coded_stream.h>
49 #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
50 #include <google/protobuf/descriptor.h>
51 #include <google/protobuf/extension_set.h>
52 #include <google/protobuf/message.h>
53 #include <google/protobuf/message_lite.h>
54 #include <google/protobuf/repeated_field.h>
55 #include <google/protobuf/unknown_field_set.h>
56 #include <google/protobuf/wire_format_lite.h>
57 #include <gtest/gtest.h>
58 #include <google/protobuf/stubs/strutil.h>
59 
60 
61 // Must be included last
62 #include <google/protobuf/port_def.inc>
63 
64 using proto2_arena_unittest::ArenaMessage;
65 using protobuf_unittest::TestAllExtensions;
66 using protobuf_unittest::TestAllTypes;
67 using protobuf_unittest::TestEmptyMessage;
68 using protobuf_unittest::TestOneof2;
69 
70 namespace google {
71 namespace protobuf {
72 
73 class Notifier {
74  public:
75  Notifier() : count_(0) {}
76  void Notify() { count_++; }
77  int GetCount() { return count_; }
78 
79  private:
80  int count_;
81 };
82 
83 class SimpleDataType {
84  public:
86  void SetNotifier(Notifier* notifier) { notifier_ = notifier; }
87  virtual ~SimpleDataType() {
88  if (notifier_ != NULL) {
89  notifier_->Notify();
90  }
91  };
92 
93  private:
95 };
96 
97 // A simple class that does not allow copying and so cannot be used as a
98 // parameter type without "const &".
99 class PleaseDontCopyMe {
100  public:
101  explicit PleaseDontCopyMe(int value) : value_(value) {}
102 
103  int value() const { return value_; }
104 
105  private:
106  int value_;
108 };
109 
110 // A class that takes four different types as constructor arguments.
111 class MustBeConstructedWithOneThroughFour {
112  public:
113  MustBeConstructedWithOneThroughFour(int one, const char* two,
114  const std::string& three,
115  const PleaseDontCopyMe* four)
116  : one_(one), two_(two), three_(three), four_(four) {}
117 
118  int one_;
119  const char* const two_;
121  const PleaseDontCopyMe* four_;
122 
123  private:
125 };
126 
127 // A class that takes eight different types as constructor arguments.
128 class MustBeConstructedWithOneThroughEight {
129  public:
130  MustBeConstructedWithOneThroughEight(int one, const char* two,
131  const std::string& three,
132  const PleaseDontCopyMe* four, int five,
133  const char* six,
134  const std::string& seven,
135  const std::string& eight)
136  : one_(one),
137  two_(two),
138  three_(three),
139  four_(four),
140  five_(five),
141  six_(six),
142  seven_(seven),
143  eight_(eight) {}
144 
145  int one_;
146  const char* const two_;
148  const PleaseDontCopyMe* four_;
149  int five_;
150  const char* const six_;
153 
154  private:
156 };
157 
158 TEST(ArenaTest, ArenaConstructable) {
162 }
163 
164 TEST(ArenaTest, DestructorSkippable) {
168 }
169 
170 TEST(ArenaTest, BasicCreate) {
171  Arena arena;
172  EXPECT_TRUE(Arena::Create<int32_t>(&arena) != NULL);
173  EXPECT_TRUE(Arena::Create<int64_t>(&arena) != NULL);
174  EXPECT_TRUE(Arena::Create<float>(&arena) != NULL);
175  EXPECT_TRUE(Arena::Create<double>(&arena) != NULL);
176  EXPECT_TRUE(Arena::Create<std::string>(&arena) != NULL);
177  arena.Own(new int32_t);
178  arena.Own(new int64_t);
179  arena.Own(new float);
180  arena.Own(new double);
181  arena.Own(new std::string);
182  arena.Own<int>(NULL);
183  Notifier notifier;
184  SimpleDataType* data = Arena::Create<SimpleDataType>(&arena);
185  data->SetNotifier(&notifier);
186  data = new SimpleDataType;
187  data->SetNotifier(&notifier);
188  arena.Own(data);
189  arena.Reset();
190  EXPECT_EQ(2, notifier.GetCount());
191 }
192 
193 TEST(ArenaTest, CreateAndConstCopy) {
194  Arena arena;
195  const std::string s("foo");
196  const std::string* s_copy = Arena::Create<std::string>(&arena, s);
197  EXPECT_TRUE(s_copy != NULL);
198  EXPECT_EQ("foo", s);
199  EXPECT_EQ("foo", *s_copy);
200 }
201 
202 TEST(ArenaTest, CreateAndNonConstCopy) {
203  Arena arena;
204  std::string s("foo");
205  const std::string* s_copy = Arena::Create<std::string>(&arena, s);
206  EXPECT_TRUE(s_copy != NULL);
207  EXPECT_EQ("foo", s);
208  EXPECT_EQ("foo", *s_copy);
209 }
210 
211 TEST(ArenaTest, CreateAndMove) {
212  Arena arena;
213  std::string s("foo");
214  const std::string* s_move = Arena::Create<std::string>(&arena, std::move(s));
215  EXPECT_TRUE(s_move != NULL);
216  EXPECT_TRUE(s.empty()); // NOLINT
217  EXPECT_EQ("foo", *s_move);
218 }
219 
220 TEST(ArenaTest, CreateWithFourConstructorArguments) {
221  Arena arena;
222  const std::string three("3");
223  const PleaseDontCopyMe four(4);
224  const MustBeConstructedWithOneThroughFour* new_object =
225  Arena::Create<MustBeConstructedWithOneThroughFour>(&arena, 1, "2", three,
226  &four);
227  EXPECT_TRUE(new_object != NULL);
228  ASSERT_EQ(1, new_object->one_);
229  ASSERT_STREQ("2", new_object->two_);
230  ASSERT_EQ("3", new_object->three_);
231  ASSERT_EQ(4, new_object->four_->value());
232 }
233 
234 TEST(ArenaTest, CreateWithEightConstructorArguments) {
235  Arena arena;
236  const std::string three("3");
237  const PleaseDontCopyMe four(4);
238  const std::string seven("7");
239  const std::string eight("8");
240  const MustBeConstructedWithOneThroughEight* new_object =
241  Arena::Create<MustBeConstructedWithOneThroughEight>(
242  &arena, 1, "2", three, &four, 5, "6", seven, eight);
243  EXPECT_TRUE(new_object != NULL);
244  ASSERT_EQ(1, new_object->one_);
245  ASSERT_STREQ("2", new_object->two_);
246  ASSERT_EQ("3", new_object->three_);
247  ASSERT_EQ(4, new_object->four_->value());
248  ASSERT_EQ(5, new_object->five_);
249  ASSERT_STREQ("6", new_object->six_);
250  ASSERT_EQ("7", new_object->seven_);
251  ASSERT_EQ("8", new_object->eight_);
252 }
253 
254 class PleaseMoveMe {
255  public:
256  explicit PleaseMoveMe(const std::string& value) : value_(value) {}
257  PleaseMoveMe(PleaseMoveMe&&) = default;
258  PleaseMoveMe(const PleaseMoveMe&) = delete;
259 
260  const std::string& value() const { return value_; }
261 
262  private:
264 };
265 
266 TEST(ArenaTest, CreateWithMoveArguments) {
267  Arena arena;
268  PleaseMoveMe one("1");
269  const PleaseMoveMe* new_object =
270  Arena::Create<PleaseMoveMe>(&arena, std::move(one));
271  EXPECT_TRUE(new_object);
272  ASSERT_EQ("1", new_object->value());
273 }
274 
275 TEST(ArenaTest, InitialBlockTooSmall) {
276  // Construct a small blocks of memory to be used by the arena allocator; then,
277  // allocate an object which will not fit in the initial block.
278  for (int size = 0; size <= Arena::kBlockOverhead + 32; size++) {
279  std::vector<char> arena_block(size);
280  ArenaOptions options;
281  options.initial_block = arena_block.data();
282  options.initial_block_size = arena_block.size();
283 
284  // Try sometimes with non-default block sizes so that we exercise paths
285  // with and without ArenaImpl::Options.
286  if ((size % 2) != 0) {
287  options.start_block_size += 8;
288  }
289 
291 
292  char* p = Arena::CreateArray<char>(&arena, 96);
293  uintptr_t allocation = reinterpret_cast<uintptr_t>(p);
294 
295  // Ensure that the arena allocator did not return memory pointing into the
296  // initial block of memory.
297  uintptr_t arena_start = reinterpret_cast<uintptr_t>(arena_block.data());
298  uintptr_t arena_end = arena_start + arena_block.size();
299  EXPECT_FALSE(allocation >= arena_start && allocation < arena_end);
300 
301  // Write to the memory we allocated; this should (but is not guaranteed to)
302  // trigger a check for heap corruption if the object was allocated from the
303  // initially-provided block.
304  memset(p, '\0', 96);
305  }
306 }
307 
308 TEST(ArenaTest, Parsing) {
309  TestAllTypes original;
310  TestUtil::SetAllFields(&original);
311 
312  // Test memory leak.
313  Arena arena;
314  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
315  arena_message->ParseFromString(original.SerializeAsString());
316  TestUtil::ExpectAllFieldsSet(*arena_message);
317 
318  // Test that string fields have nul terminator bytes (earlier bug).
319  EXPECT_EQ(strlen(original.optional_string().c_str()),
320  strlen(arena_message->optional_string().c_str()));
321 }
322 
323 TEST(ArenaTest, UnknownFields) {
324  TestAllTypes original;
325  TestUtil::SetAllFields(&original);
326 
327  // Test basic parsing into (populating) and reading out of unknown fields on
328  // an arena.
329  Arena arena;
330  TestEmptyMessage* arena_message =
331  Arena::CreateMessage<TestEmptyMessage>(&arena);
332  arena_message->ParseFromString(original.SerializeAsString());
333 
334  TestAllTypes copied;
335  copied.ParseFromString(arena_message->SerializeAsString());
337 
338  // Exercise UFS manual manipulation (setters).
339  arena_message = Arena::CreateMessage<TestEmptyMessage>(&arena);
340  arena_message->mutable_unknown_fields()->AddVarint(
341  TestAllTypes::kOptionalInt32FieldNumber, 42);
342  copied.Clear();
343  copied.ParseFromString(arena_message->SerializeAsString());
344  EXPECT_TRUE(copied.has_optional_int32());
345  EXPECT_EQ(42, copied.optional_int32());
346 
347  // Exercise UFS swap path.
348  TestEmptyMessage* arena_message_2 =
349  Arena::CreateMessage<TestEmptyMessage>(&arena);
350  arena_message_2->Swap(arena_message);
351  copied.Clear();
352  copied.ParseFromString(arena_message_2->SerializeAsString());
353  EXPECT_TRUE(copied.has_optional_int32());
354  EXPECT_EQ(42, copied.optional_int32());
355 
356  // Test field manipulation.
357  TestEmptyMessage* arena_message_3 =
358  Arena::CreateMessage<TestEmptyMessage>(&arena);
359  arena_message_3->mutable_unknown_fields()->AddVarint(1000, 42);
360  arena_message_3->mutable_unknown_fields()->AddFixed32(1001, 42);
361  arena_message_3->mutable_unknown_fields()->AddFixed64(1002, 42);
362  arena_message_3->mutable_unknown_fields()->AddLengthDelimited(1003);
363  arena_message_3->mutable_unknown_fields()->DeleteSubrange(0, 2);
364  arena_message_3->mutable_unknown_fields()->DeleteByNumber(1002);
365  arena_message_3->mutable_unknown_fields()->DeleteByNumber(1003);
366  EXPECT_TRUE(arena_message_3->unknown_fields().empty());
367 }
368 
369 TEST(ArenaTest, Swap) {
370  Arena arena1;
371  Arena arena2;
372  TestAllTypes* arena1_message;
373  TestAllTypes* arena2_message;
374 
375  // Case 1: Swap(), no UFS on either message, both messages on different
376  // arenas. Arena pointers should remain the same after swap.
377  arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
378  arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
379  arena1_message->Swap(arena2_message);
380  EXPECT_EQ(&arena1, arena1_message->GetArena());
381  EXPECT_EQ(&arena2, arena2_message->GetArena());
382 
383  // Case 2: Swap(), UFS on one message, both messages on different arenas.
384  arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
385  arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
386  arena1_message->mutable_unknown_fields()->AddVarint(1, 42);
387  arena1_message->Swap(arena2_message);
388  EXPECT_EQ(&arena1, arena1_message->GetArena());
389  EXPECT_EQ(&arena2, arena2_message->GetArena());
390  EXPECT_EQ(0, arena1_message->unknown_fields().field_count());
391  EXPECT_EQ(1, arena2_message->unknown_fields().field_count());
392  EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint());
393 
394  // Case 3: Swap(), UFS on both messages, both messages on different arenas.
395  arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
396  arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
397  arena1_message->mutable_unknown_fields()->AddVarint(1, 42);
398  arena2_message->mutable_unknown_fields()->AddVarint(2, 84);
399  arena1_message->Swap(arena2_message);
400  EXPECT_EQ(&arena1, arena1_message->GetArena());
401  EXPECT_EQ(&arena2, arena2_message->GetArena());
402  EXPECT_EQ(1, arena1_message->unknown_fields().field_count());
403  EXPECT_EQ(1, arena2_message->unknown_fields().field_count());
404  EXPECT_EQ(84, arena1_message->unknown_fields().field(0).varint());
405  EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint());
406 }
407 
408 TEST(ArenaTest, ReflectionSwapFields) {
409  Arena arena1;
410  Arena arena2;
411  TestAllTypes* arena1_message;
412  TestAllTypes* arena2_message;
413 
414  // Case 1: messages on different arenas, only one message is set.
415  arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
416  arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
417  TestUtil::SetAllFields(arena1_message);
418  const Reflection* reflection = arena1_message->GetReflection();
419  std::vector<const FieldDescriptor*> fields;
420  reflection->ListFields(*arena1_message, &fields);
421  reflection->SwapFields(arena1_message, arena2_message, fields);
422  EXPECT_EQ(&arena1, arena1_message->GetArena());
423  EXPECT_EQ(&arena2, arena2_message->GetArena());
425  arena1_message->SerializeToString(&output);
426  EXPECT_EQ(0, output.size());
427  TestUtil::ExpectAllFieldsSet(*arena2_message);
428  reflection->SwapFields(arena1_message, arena2_message, fields);
429  arena2_message->SerializeToString(&output);
430  EXPECT_EQ(0, output.size());
431  TestUtil::ExpectAllFieldsSet(*arena1_message);
432 
433  // Case 2: messages on different arenas, both messages are set.
434  arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
435  arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
436  TestUtil::SetAllFields(arena1_message);
437  TestUtil::SetAllFields(arena2_message);
438  reflection->SwapFields(arena1_message, arena2_message, fields);
439  EXPECT_EQ(&arena1, arena1_message->GetArena());
440  EXPECT_EQ(&arena2, arena2_message->GetArena());
441  TestUtil::ExpectAllFieldsSet(*arena1_message);
442  TestUtil::ExpectAllFieldsSet(*arena2_message);
443 
444  // Case 3: messages on different arenas with different lifetimes.
445  arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
446  {
447  Arena arena3;
448  TestAllTypes* arena3_message = Arena::CreateMessage<TestAllTypes>(&arena3);
449  TestUtil::SetAllFields(arena3_message);
450  reflection->SwapFields(arena1_message, arena3_message, fields);
451  }
452  TestUtil::ExpectAllFieldsSet(*arena1_message);
453 
454  // Case 4: one message on arena, the other on heap.
455  arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
456  TestAllTypes message;
457  TestUtil::SetAllFields(arena1_message);
458  reflection->SwapFields(arena1_message, &message, fields);
459  EXPECT_EQ(&arena1, arena1_message->GetArena());
460  EXPECT_EQ(nullptr, message.GetArena());
461  arena1_message->SerializeToString(&output);
462  EXPECT_EQ(0, output.size());
464 }
465 
466 TEST(ArenaTest, SetAllocatedMessage) {
467  Arena arena;
468  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
469  TestAllTypes::NestedMessage* nested = new TestAllTypes::NestedMessage;
470  nested->set_bb(118);
471  arena_message->set_allocated_optional_nested_message(nested);
472  EXPECT_EQ(118, arena_message->optional_nested_message().bb());
473 }
474 
475 TEST(ArenaTest, ReleaseMessage) {
476  Arena arena;
477  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
478  arena_message->mutable_optional_nested_message()->set_bb(118);
479  std::unique_ptr<TestAllTypes::NestedMessage> nested(
480  arena_message->release_optional_nested_message());
481  EXPECT_EQ(118, nested->bb());
482 
483  TestAllTypes::NestedMessage* released_null =
484  arena_message->release_optional_nested_message();
485  EXPECT_EQ(NULL, released_null);
486 }
487 
488 TEST(ArenaTest, SetAllocatedString) {
489  Arena arena;
490  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
491  std::string* allocated_str = new std::string("hello");
492  arena_message->set_allocated_optional_string(allocated_str);
493  EXPECT_EQ("hello", arena_message->optional_string());
494 }
495 
496 TEST(ArenaTest, ReleaseString) {
497  Arena arena;
498  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
499  arena_message->set_optional_string("hello");
500  std::unique_ptr<std::string> released_str(
501  arena_message->release_optional_string());
502  EXPECT_EQ("hello", *released_str);
503 
504  // Test default value.
505 }
506 
507 
508 TEST(ArenaTest, SwapBetweenArenasWithAllFieldsSet) {
509  Arena arena1;
510  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
511  {
512  Arena arena2;
513  TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
514  TestUtil::SetAllFields(arena2_message);
515  arena2_message->Swap(arena1_message);
517  arena2_message->SerializeToString(&output);
518  EXPECT_EQ(0, output.size());
519  }
520  TestUtil::ExpectAllFieldsSet(*arena1_message);
521 }
522 
523 TEST(ArenaTest, SwapBetweenArenaAndNonArenaWithAllFieldsSet) {
524  TestAllTypes non_arena_message;
525  TestUtil::SetAllFields(&non_arena_message);
526  {
527  Arena arena2;
528  TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
529  TestUtil::SetAllFields(arena2_message);
530  arena2_message->Swap(&non_arena_message);
531  TestUtil::ExpectAllFieldsSet(*arena2_message);
532  TestUtil::ExpectAllFieldsSet(non_arena_message);
533  }
534 }
535 
536 TEST(ArenaTest, UnsafeArenaSwap) {
537  Arena shared_arena;
538  TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&shared_arena);
539  TestAllTypes* message2 = Arena::CreateMessage<TestAllTypes>(&shared_arena);
540  TestUtil::SetAllFields(message1);
541  message1->UnsafeArenaSwap(message2);
542  TestUtil::ExpectAllFieldsSet(*message2);
543 }
544 
545 TEST(ArenaTest, SwapBetweenArenasUsingReflection) {
546  Arena arena1;
547  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
548  {
549  Arena arena2;
550  TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
551  TestUtil::SetAllFields(arena2_message);
552  const Reflection* r = arena2_message->GetReflection();
553  r->Swap(arena1_message, arena2_message);
555  arena2_message->SerializeToString(&output);
556  EXPECT_EQ(0, output.size());
557  }
558  TestUtil::ExpectAllFieldsSet(*arena1_message);
559 }
560 
561 TEST(ArenaTest, SwapBetweenArenaAndNonArenaUsingReflection) {
562  TestAllTypes non_arena_message;
563  TestUtil::SetAllFields(&non_arena_message);
564  {
565  Arena arena2;
566  TestAllTypes* arena2_message = Arena::CreateMessage<TestAllTypes>(&arena2);
567  TestUtil::SetAllFields(arena2_message);
568  const Reflection* r = arena2_message->GetReflection();
569  r->Swap(&non_arena_message, arena2_message);
570  TestUtil::ExpectAllFieldsSet(*arena2_message);
571  TestUtil::ExpectAllFieldsSet(non_arena_message);
572  }
573 }
574 
575 TEST(ArenaTest, ReleaseFromArenaMessageMakesCopy) {
576  TestAllTypes::NestedMessage* nested_msg = NULL;
577  std::string* nested_string = NULL;
578  {
579  Arena arena;
580  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
581  arena_message->mutable_optional_nested_message()->set_bb(42);
582  *arena_message->mutable_optional_string() = "Hello";
583  nested_msg = arena_message->release_optional_nested_message();
584  nested_string = arena_message->release_optional_string();
585  }
586  EXPECT_EQ(42, nested_msg->bb());
587  EXPECT_EQ("Hello", *nested_string);
588  delete nested_msg;
589  delete nested_string;
590 }
591 
592 #if PROTOBUF_RTTI
593 TEST(ArenaTest, ReleaseFromArenaMessageUsingReflectionMakesCopy) {
594  TestAllTypes::NestedMessage* nested_msg = NULL;
595  // Note: no string: reflection API only supports releasing submessages.
596  {
597  Arena arena;
598  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
599  arena_message->mutable_optional_nested_message()->set_bb(42);
600  const Reflection* r = arena_message->GetReflection();
601  const FieldDescriptor* f = arena_message->GetDescriptor()->FindFieldByName(
602  "optional_nested_message");
603  nested_msg = static_cast<TestAllTypes::NestedMessage*>(
604  r->ReleaseMessage(arena_message, f));
605  }
606  EXPECT_EQ(42, nested_msg->bb());
607  delete nested_msg;
608 }
609 #endif // PROTOBUF_RTTI
610 
611 TEST(ArenaTest, SetAllocatedAcrossArenas) {
612  Arena arena1;
613  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
614  TestAllTypes::NestedMessage* heap_submessage =
615  new TestAllTypes::NestedMessage();
616  heap_submessage->set_bb(42);
617  arena1_message->set_allocated_optional_nested_message(heap_submessage);
618  // Should keep same object and add to arena's Own()-list.
619  EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
620  {
621  Arena arena2;
622  TestAllTypes::NestedMessage* arena2_submessage =
623  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
624  arena2_submessage->set_bb(42);
625 #ifdef PROTOBUF_HAS_DEATH_TEST
626  EXPECT_DEBUG_DEATH(arena1_message->set_allocated_optional_nested_message(
627  arena2_submessage),
628  "submessage_arena");
629 #endif
630  EXPECT_NE(arena2_submessage,
631  arena1_message->mutable_optional_nested_message());
632  }
633 
634  TestAllTypes::NestedMessage* arena1_submessage =
635  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
636  arena1_submessage->set_bb(42);
637  TestAllTypes* heap_message = new TestAllTypes;
638 #ifdef PROTOBUF_HAS_DEATH_TEST
639  EXPECT_DEBUG_DEATH(
640  heap_message->set_allocated_optional_nested_message(arena1_submessage),
641  "submessage_arena");
642 #endif
643  EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
644  delete heap_message;
645 }
646 
647 TEST(ArenaTest, UnsafeArenaSetAllocatedAcrossArenas) {
648  Arena arena1;
649  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
650  {
651  Arena arena2;
652  TestAllTypes::NestedMessage* arena2_submessage =
653  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
654  arena2_submessage->set_bb(42);
655  arena1_message->unsafe_arena_set_allocated_optional_nested_message(
656  arena2_submessage);
657  EXPECT_EQ(arena2_submessage,
658  arena1_message->mutable_optional_nested_message());
659  EXPECT_EQ(arena2_submessage,
660  arena1_message->unsafe_arena_release_optional_nested_message());
661  }
662 
663  TestAllTypes::NestedMessage* arena1_submessage =
664  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
665  arena1_submessage->set_bb(42);
666  TestAllTypes* heap_message = new TestAllTypes;
667  heap_message->unsafe_arena_set_allocated_optional_nested_message(
668  arena1_submessage);
669  EXPECT_EQ(arena1_submessage, heap_message->mutable_optional_nested_message());
670  EXPECT_EQ(arena1_submessage,
671  heap_message->unsafe_arena_release_optional_nested_message());
672  delete heap_message;
673 }
674 
675 TEST(ArenaTest, SetAllocatedAcrossArenasWithReflection) {
676  // Same as above, with reflection.
677  Arena arena1;
678  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
679  const Reflection* r = arena1_message->GetReflection();
680  const Descriptor* d = arena1_message->GetDescriptor();
681  const FieldDescriptor* msg_field =
682  d->FindFieldByName("optional_nested_message");
683  TestAllTypes::NestedMessage* heap_submessage =
684  new TestAllTypes::NestedMessage();
685  heap_submessage->set_bb(42);
686  r->SetAllocatedMessage(arena1_message, heap_submessage, msg_field);
687  // Should keep same object and add to arena's Own()-list.
688  EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
689  {
690  Arena arena2;
691  TestAllTypes::NestedMessage* arena2_submessage =
692  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
693  arena2_submessage->set_bb(42);
694 #ifdef PROTOBUF_HAS_DEATH_TEST
695  EXPECT_DEBUG_DEATH(
696  r->SetAllocatedMessage(arena1_message, arena2_submessage, msg_field),
697  "GetOwningArena");
698 #endif
699  EXPECT_NE(arena2_submessage,
700  arena1_message->mutable_optional_nested_message());
701  }
702 
703  TestAllTypes::NestedMessage* arena1_submessage =
704  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
705  arena1_submessage->set_bb(42);
706  TestAllTypes* heap_message = new TestAllTypes;
707 #ifdef PROTOBUF_HAS_DEATH_TEST
708  EXPECT_DEBUG_DEATH(
709  r->SetAllocatedMessage(heap_message, arena1_submessage, msg_field),
710  "GetOwningArena");
711 #endif
712  EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
713  delete heap_message;
714 }
715 
716 TEST(ArenaTest, UnsafeArenaSetAllocatedAcrossArenasWithReflection) {
717  // Same as above, with reflection.
718  Arena arena1;
719  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
720  const Reflection* r = arena1_message->GetReflection();
721  const Descriptor* d = arena1_message->GetDescriptor();
722  const FieldDescriptor* msg_field =
723  d->FindFieldByName("optional_nested_message");
724  {
725  Arena arena2;
726  TestAllTypes::NestedMessage* arena2_submessage =
727  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
728  arena2_submessage->set_bb(42);
729  r->UnsafeArenaSetAllocatedMessage(arena1_message, arena2_submessage,
730  msg_field);
731  EXPECT_EQ(arena2_submessage,
732  arena1_message->mutable_optional_nested_message());
733  EXPECT_EQ(arena2_submessage,
734  arena1_message->unsafe_arena_release_optional_nested_message());
735  }
736 
737  TestAllTypes::NestedMessage* arena1_submessage =
738  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena1);
739  arena1_submessage->set_bb(42);
740  TestAllTypes* heap_message = new TestAllTypes;
741  r->UnsafeArenaSetAllocatedMessage(heap_message, arena1_submessage, msg_field);
742  EXPECT_EQ(arena1_submessage, heap_message->mutable_optional_nested_message());
743  EXPECT_EQ(arena1_submessage,
744  heap_message->unsafe_arena_release_optional_nested_message());
745  delete heap_message;
746 }
747 
748 TEST(ArenaTest, AddAllocatedWithReflection) {
749  Arena arena1;
750  ArenaMessage* arena1_message = Arena::CreateMessage<ArenaMessage>(&arena1);
751  const Reflection* r = arena1_message->GetReflection();
752  const Descriptor* d = arena1_message->GetDescriptor();
753  // Message with cc_enable_arenas = true;
754  const FieldDescriptor* fd = d->FindFieldByName("repeated_nested_message");
755  r->AddMessage(arena1_message, fd);
756  r->AddMessage(arena1_message, fd);
757  r->AddMessage(arena1_message, fd);
758  EXPECT_EQ(3, r->FieldSize(*arena1_message, fd));
759 }
760 
761 TEST(ArenaTest, RepeatedPtrFieldAddClearedTest) {
762 #ifndef PROTOBUF_FUTURE_BREAKING_CHANGES
763  {
764  RepeatedPtrField<TestAllTypes> repeated_field;
765  EXPECT_TRUE(repeated_field.empty());
766  EXPECT_EQ(0, repeated_field.size());
767  // Ownership is passed to repeated_field.
768  TestAllTypes* cleared = new TestAllTypes();
769  repeated_field.AddCleared(cleared);
770  EXPECT_TRUE(repeated_field.empty());
771  EXPECT_EQ(0, repeated_field.size());
772  }
773 #endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
774  {
775  RepeatedPtrField<TestAllTypes> repeated_field;
776  EXPECT_TRUE(repeated_field.empty());
777  EXPECT_EQ(0, repeated_field.size());
778  // Ownership is passed to repeated_field.
779  TestAllTypes* cleared = new TestAllTypes();
780  repeated_field.AddAllocated(cleared);
781  EXPECT_FALSE(repeated_field.empty());
782  EXPECT_EQ(1, repeated_field.size());
783  }
784 }
785 
786 TEST(ArenaTest, AddAllocatedToRepeatedField) {
787  // Heap->arena case.
788  Arena arena1;
789  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
790  for (int i = 0; i < 10; i++) {
791  TestAllTypes::NestedMessage* heap_submessage =
792  new TestAllTypes::NestedMessage();
793  heap_submessage->set_bb(42);
794  arena1_message->mutable_repeated_nested_message()->AddAllocated(
795  heap_submessage);
796  // Should not copy object -- will use arena_->Own().
797  EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i));
798  EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
799  }
800 
801  // Arena1->Arena2 case.
802  arena1_message->Clear();
803  for (int i = 0; i < 10; i++) {
804  Arena arena2;
805  TestAllTypes::NestedMessage* arena2_submessage =
806  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
807  arena2_submessage->set_bb(42);
808 #ifdef PROTOBUF_HAS_DEATH_TEST
809  EXPECT_DEBUG_DEATH(
810  arena1_message->mutable_repeated_nested_message()->AddAllocated(
811  arena2_submessage),
812  "value_arena");
813 #endif
814  // Should not receive object.
815  EXPECT_TRUE(arena1_message->repeated_nested_message().empty());
816  }
817 
818  // Arena->heap case.
819  TestAllTypes* heap_message = new TestAllTypes;
820  for (int i = 0; i < 10; i++) {
821  Arena arena2;
822  TestAllTypes::NestedMessage* arena2_submessage =
823  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
824  arena2_submessage->set_bb(42);
825 #ifdef PROTOBUF_HAS_DEATH_TEST
826  EXPECT_DEBUG_DEATH(
827  heap_message->mutable_repeated_nested_message()->AddAllocated(
828  arena2_submessage),
829  "value_arena");
830 #endif
831  // Should not receive object.
832  EXPECT_TRUE(heap_message->repeated_nested_message().empty());
833  }
834  delete heap_message;
835 
836  // Heap->arena case for strings (which are not arena-allocated).
837  arena1_message->Clear();
838  for (int i = 0; i < 10; i++) {
839  std::string* s = new std::string("Test");
840  arena1_message->mutable_repeated_string()->AddAllocated(s);
841  // Should not copy.
842  EXPECT_EQ(s, &arena1_message->repeated_string(i));
843  EXPECT_EQ("Test", arena1_message->repeated_string(i));
844  }
845 }
846 
847 TEST(ArenaTest, UnsafeArenaAddAllocatedToRepeatedField) {
848  // Heap->arena case.
849  Arena arena1;
850  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
851  {
852  auto* heap_submessage = new TestAllTypes::NestedMessage;
853  arena1_message->mutable_repeated_nested_message()->UnsafeArenaAddAllocated(
854  heap_submessage);
855  // Should not copy object.
856  EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(0));
857  EXPECT_EQ(heap_submessage, arena1_message->mutable_repeated_nested_message()
858  ->UnsafeArenaReleaseLast());
859  delete heap_submessage;
860  }
861 
862  // Arena1->Arena2 case.
863  arena1_message->Clear();
864  {
865  Arena arena2;
866  TestAllTypes::NestedMessage* arena2_submessage =
867  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
868  arena2_submessage->set_bb(42);
869  arena1_message->mutable_repeated_nested_message()->UnsafeArenaAddAllocated(
870  arena2_submessage);
871  // Should own object.
872  EXPECT_EQ(arena2_submessage, &arena1_message->repeated_nested_message(0));
873  EXPECT_EQ(arena2_submessage,
874  arena1_message->mutable_repeated_nested_message()
875  ->UnsafeArenaReleaseLast());
876  }
877 
878  // Arena->heap case.
879  TestAllTypes* heap_message = new TestAllTypes;
880  {
881  Arena arena2;
882  TestAllTypes::NestedMessage* arena2_submessage =
883  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
884  arena2_submessage->set_bb(42);
885  heap_message->mutable_repeated_nested_message()->UnsafeArenaAddAllocated(
886  arena2_submessage);
887  // Should own object.
888  EXPECT_EQ(arena2_submessage, &heap_message->repeated_nested_message(0));
889  EXPECT_EQ(arena2_submessage, heap_message->mutable_repeated_nested_message()
890  ->UnsafeArenaReleaseLast());
891  }
892  delete heap_message;
893 
894  // Heap->arena case for strings (which are not arena-allocated).
895  arena1_message->Clear();
896  {
897  std::string* s = new std::string("Test");
898  arena1_message->mutable_repeated_string()->UnsafeArenaAddAllocated(s);
899  // Should not copy.
900  EXPECT_EQ(s, &arena1_message->repeated_string(0));
901  EXPECT_EQ("Test", arena1_message->repeated_string(0));
902  delete arena1_message->mutable_repeated_string()->UnsafeArenaReleaseLast();
903  }
904 }
905 
906 TEST(ArenaTest, AddAllocatedToRepeatedFieldViaReflection) {
907  // Heap->arena case.
908  Arena arena1;
909  TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
910  const Reflection* r = arena1_message->GetReflection();
911  const Descriptor* d = arena1_message->GetDescriptor();
912  const FieldDescriptor* fd = d->FindFieldByName("repeated_nested_message");
913  for (int i = 0; i < 10; i++) {
914  TestAllTypes::NestedMessage* heap_submessage =
915  new TestAllTypes::NestedMessage;
916  heap_submessage->set_bb(42);
917  r->AddAllocatedMessage(arena1_message, fd, heap_submessage);
918  // Should not copy object -- will use arena_->Own().
919  EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i));
920  EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
921  }
922 
923  // Arena1->Arena2 case.
924  arena1_message->Clear();
925  for (int i = 0; i < 10; i++) {
926  Arena arena2;
927  TestAllTypes::NestedMessage* arena2_submessage =
928  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
929  arena2_submessage->set_bb(42);
930 #ifdef PROTOBUF_HAS_DEATH_TEST
931  EXPECT_DEBUG_DEATH(
932  r->AddAllocatedMessage(arena1_message, fd, arena2_submessage),
933  "value_arena");
934 #endif
935  // Should not receive object.
936  EXPECT_TRUE(arena1_message->repeated_nested_message().empty());
937  }
938 
939  // Arena->heap case.
940  TestAllTypes* heap_message = new TestAllTypes;
941  for (int i = 0; i < 10; i++) {
942  Arena arena2;
943  TestAllTypes::NestedMessage* arena2_submessage =
944  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
945  arena2_submessage->set_bb(42);
946 #ifdef PROTOBUF_HAS_DEATH_TEST
947  EXPECT_DEBUG_DEATH(
948  r->AddAllocatedMessage(heap_message, fd, arena2_submessage),
949  "value_arena");
950 #endif
951  // Should not receive object.
952  EXPECT_TRUE(heap_message->repeated_nested_message().empty());
953  }
954  delete heap_message;
955 }
956 
957 TEST(ArenaTest, ReleaseLastRepeatedField) {
958  // Release from arena-allocated repeated field and ensure that returned object
959  // is heap-allocated.
960  Arena arena;
961  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
962  for (int i = 0; i < 10; i++) {
963  TestAllTypes::NestedMessage* nested =
964  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena);
965  nested->set_bb(42);
966  arena_message->mutable_repeated_nested_message()->AddAllocated(nested);
967  }
968 
969  for (int i = 0; i < 10; i++) {
970  const TestAllTypes::NestedMessage* orig_submessage =
971  &arena_message->repeated_nested_message(10 - 1 - i); // last element
972  TestAllTypes::NestedMessage* released =
973  arena_message->mutable_repeated_nested_message()->ReleaseLast();
974  EXPECT_NE(released, orig_submessage);
975  EXPECT_EQ(42, released->bb());
976  delete released;
977  }
978 
979  // Test UnsafeArenaReleaseLast().
980  for (int i = 0; i < 10; i++) {
981  TestAllTypes::NestedMessage* nested =
982  Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena);
983  nested->set_bb(42);
984  arena_message->mutable_repeated_nested_message()->AddAllocated(nested);
985  }
986 
987  for (int i = 0; i < 10; i++) {
988  const TestAllTypes::NestedMessage* orig_submessage =
989  &arena_message->repeated_nested_message(10 - 1 - i); // last element
990  TestAllTypes::NestedMessage* released =
991  arena_message->mutable_repeated_nested_message()
992  ->UnsafeArenaReleaseLast();
993  EXPECT_EQ(released, orig_submessage);
994  EXPECT_EQ(42, released->bb());
995  // no delete -- |released| is on the arena.
996  }
997 
998  // Test string case as well. ReleaseLast() in this case must copy the
999  // string, even though it was originally heap-allocated and its pointer
1000  // was simply appended to the repeated field's internal vector, because the
1001  // string was placed on the arena's destructor list and cannot be removed
1002  // from that list (so the arena permanently owns the original instance).
1003  arena_message->Clear();
1004  for (int i = 0; i < 10; i++) {
1005  std::string* s = new std::string("Test");
1006  arena_message->mutable_repeated_string()->AddAllocated(s);
1007  }
1008  for (int i = 0; i < 10; i++) {
1009  const std::string* orig_element =
1010  &arena_message->repeated_string(10 - 1 - i);
1011  std::string* released =
1012  arena_message->mutable_repeated_string()->ReleaseLast();
1013  EXPECT_NE(released, orig_element);
1014  EXPECT_EQ("Test", *released);
1015  delete released;
1016  }
1017 }
1018 
1019 TEST(ArenaTest, UnsafeArenaAddAllocated) {
1020  Arena arena;
1021  TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
1022  for (int i = 0; i < 10; i++) {
1023  std::string* arena_string = Arena::Create<std::string>(&arena);
1024  message->mutable_repeated_string()->UnsafeArenaAddAllocated(arena_string);
1025  EXPECT_EQ(arena_string, message->mutable_repeated_string(i));
1026  }
1027 }
1028 
1029 TEST(ArenaTest, OneofMerge) {
1030  Arena arena;
1031  TestAllTypes* message0 = Arena::CreateMessage<TestAllTypes>(&arena);
1032  TestAllTypes* message1 = Arena::CreateMessage<TestAllTypes>(&arena);
1033 
1034  message0->set_oneof_string("x");
1035  ASSERT_TRUE(message0->has_oneof_string());
1036  message1->set_oneof_string("y");
1037  ASSERT_TRUE(message1->has_oneof_string());
1038  EXPECT_EQ("x", message0->oneof_string());
1039  EXPECT_EQ("y", message1->oneof_string());
1040  message0->MergeFrom(*message1);
1041  EXPECT_EQ("y", message0->oneof_string());
1042  EXPECT_EQ("y", message1->oneof_string());
1043 }
1044 
1045 TEST(ArenaTest, ArenaOneofReflection) {
1046  Arena arena;
1047  TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
1048  const Descriptor* desc = message->GetDescriptor();
1049  const Reflection* refl = message->GetReflection();
1050 
1051  const FieldDescriptor* string_field = desc->FindFieldByName("oneof_string");
1052  const FieldDescriptor* msg_field =
1053  desc->FindFieldByName("oneof_nested_message");
1054  const OneofDescriptor* oneof = desc->FindOneofByName("oneof_field");
1055 
1056  refl->SetString(message, string_field, "Test value");
1057  EXPECT_TRUE(refl->HasOneof(*message, oneof));
1058  refl->ClearOneof(message, oneof);
1059  EXPECT_FALSE(refl->HasOneof(*message, oneof));
1060 
1061  Message* submsg = refl->MutableMessage(message, msg_field);
1062  EXPECT_TRUE(refl->HasOneof(*message, oneof));
1063  refl->ClearOneof(message, oneof);
1064  EXPECT_FALSE(refl->HasOneof(*message, oneof));
1065  refl->MutableMessage(message, msg_field);
1066  EXPECT_TRUE(refl->HasOneof(*message, oneof));
1067  submsg = refl->ReleaseMessage(message, msg_field);
1068  EXPECT_FALSE(refl->HasOneof(*message, oneof));
1069  EXPECT_TRUE(submsg->GetArena() == NULL);
1070  delete submsg;
1071 }
1072 
1073 void TestSwapRepeatedField(Arena* arena1, Arena* arena2) {
1074  // Test "safe" (copying) semantics for direct Swap() on RepeatedPtrField
1075  // between arenas.
1076  RepeatedPtrField<TestAllTypes> field1(arena1);
1077  RepeatedPtrField<TestAllTypes> field2(arena2);
1078  for (int i = 0; i < 10; i++) {
1079  TestAllTypes* t = Arena::CreateMessage<TestAllTypes>(arena1);
1080  t->set_optional_string("field1");
1081  t->set_optional_int32(i);
1082  if (arena1 != NULL) {
1083  field1.UnsafeArenaAddAllocated(t);
1084  } else {
1085  field1.AddAllocated(t);
1086  }
1087  }
1088  for (int i = 0; i < 5; i++) {
1089  TestAllTypes* t = Arena::CreateMessage<TestAllTypes>(arena2);
1090  t->set_optional_string("field2");
1091  t->set_optional_int32(i);
1092  if (arena2 != NULL) {
1093  field2.UnsafeArenaAddAllocated(t);
1094  } else {
1095  field2.AddAllocated(t);
1096  }
1097  }
1098  field1.Swap(&field2);
1099  EXPECT_EQ(5, field1.size());
1100  EXPECT_EQ(10, field2.size());
1101  EXPECT_TRUE(std::string("field1") == field2.Get(0).optional_string());
1102  EXPECT_TRUE(std::string("field2") == field1.Get(0).optional_string());
1103  // Ensure that fields retained their original order:
1104  for (int i = 0; i < field1.size(); i++) {
1105  EXPECT_EQ(i, field1.Get(i).optional_int32());
1106  }
1107  for (int i = 0; i < field2.size(); i++) {
1108  EXPECT_EQ(i, field2.Get(i).optional_int32());
1109  }
1110 }
1111 
1112 TEST(ArenaTest, SwapRepeatedField) {
1113  Arena arena;
1115 }
1116 
1117 TEST(ArenaTest, SwapRepeatedFieldWithDifferentArenas) {
1118  Arena arena1;
1119  Arena arena2;
1120  TestSwapRepeatedField(&arena1, &arena2);
1121 }
1122 
1123 TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnRightHandSide) {
1124  Arena arena;
1125  TestSwapRepeatedField(&arena, NULL);
1126 }
1127 
1128 TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnLeftHandSide) {
1129  Arena arena;
1130  TestSwapRepeatedField(NULL, &arena);
1131 }
1132 
1133 TEST(ArenaTest, ExtensionsOnArena) {
1134  Arena arena;
1135  // Ensure no leaks.
1136  TestAllExtensions* message_ext =
1137  Arena::CreateMessage<TestAllExtensions>(&arena);
1138  message_ext->SetExtension(protobuf_unittest::optional_int32_extension, 42);
1139  message_ext->SetExtension(protobuf_unittest::optional_string_extension,
1140  std::string("test"));
1141  message_ext
1142  ->MutableExtension(protobuf_unittest::optional_nested_message_extension)
1143  ->set_bb(42);
1144 }
1145 
1146 TEST(ArenaTest, RepeatedFieldOnArena) {
1147  // Preallocate an initial arena block to avoid mallocs during hooked region.
1148  std::vector<char> arena_block(1024 * 1024);
1149  Arena arena(arena_block.data(), arena_block.size());
1150 
1151  {
1152  internal::NoHeapChecker no_heap;
1153 
1154  // Fill some repeated fields on the arena to test for leaks. Also verify no
1155  // memory allocations.
1156  RepeatedField<int32_t> repeated_int32(&arena);
1157  RepeatedPtrField<TestAllTypes> repeated_message(&arena);
1158  for (int i = 0; i < 100; i++) {
1159  repeated_int32.Add(42);
1160  repeated_message.Add()->set_optional_int32(42);
1161  EXPECT_EQ(&arena, repeated_message.Get(0).GetArena());
1162  const TestAllTypes* msg_in_repeated_field = &repeated_message.Get(0);
1163  TestAllTypes* msg = repeated_message.UnsafeArenaReleaseLast();
1164  EXPECT_EQ(msg_in_repeated_field, msg);
1165  }
1166 
1167  // UnsafeArenaExtractSubrange (i) should not leak and (ii) should return
1168  // on-arena pointers.
1169  for (int i = 0; i < 10; i++) {
1170  repeated_message.Add()->set_optional_int32(42);
1171  }
1172  TestAllTypes* extracted_messages[5];
1173  repeated_message.UnsafeArenaExtractSubrange(0, 5, extracted_messages);
1174  EXPECT_EQ(&arena, repeated_message.Get(0).GetArena());
1175  EXPECT_EQ(5, repeated_message.size());
1176  }
1177 
1178  // Now, outside the scope of the NoHeapChecker, test ExtractSubrange's copying
1179  // semantics.
1180  {
1181  RepeatedPtrField<TestAllTypes> repeated_message(&arena);
1182  for (int i = 0; i < 100; i++) {
1183  repeated_message.Add()->set_optional_int32(42);
1184  }
1185 
1186  TestAllTypes* extracted_messages[5];
1187  // ExtractSubrange should copy to the heap.
1188  repeated_message.ExtractSubrange(0, 5, extracted_messages);
1189  EXPECT_EQ(NULL, extracted_messages[0]->GetArena());
1190  // We need to free the heap-allocated messages to prevent a leak.
1191  for (int i = 0; i < 5; i++) {
1192  delete extracted_messages[i];
1193  extracted_messages[i] = NULL;
1194  }
1195  }
1196 
1197  // Now check that we can create RepeatedFields/RepeatedPtrFields themselves on
1198  // the arena. They have the necessary type traits so that they can behave like
1199  // messages in this way. This is useful for higher-level generic templated
1200  // code that may allocate messages or repeated fields of messages on an arena.
1201  {
1202  RepeatedPtrField<TestAllTypes>* repeated_ptr_on_arena =
1203  Arena::CreateMessage<RepeatedPtrField<TestAllTypes> >(&arena);
1204  for (int i = 0; i < 10; i++) {
1205  // Add some elements and let the leak-checker ensure that everything is
1206  // freed.
1207  repeated_ptr_on_arena->Add();
1208  }
1209 
1210  RepeatedField<int>* repeated_int_on_arena =
1211  Arena::CreateMessage<RepeatedField<int> >(&arena);
1212  for (int i = 0; i < 100; i++) {
1213  repeated_int_on_arena->Add(i);
1214  }
1215 
1216  }
1217 
1218  arena.Reset();
1219 }
1220 
1221 
1222 #if PROTOBUF_RTTI
1223 TEST(ArenaTest, MutableMessageReflection) {
1224  Arena arena;
1225  TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
1226  const Reflection* r = message->GetReflection();
1227  const Descriptor* d = message->GetDescriptor();
1228  const FieldDescriptor* field = d->FindFieldByName("optional_nested_message");
1229  TestAllTypes::NestedMessage* submessage =
1230  static_cast<TestAllTypes::NestedMessage*>(
1231  r->MutableMessage(message, field));
1232  TestAllTypes::NestedMessage* submessage_expected =
1233  message->mutable_optional_nested_message();
1234 
1235  EXPECT_EQ(submessage_expected, submessage);
1236  EXPECT_EQ(&arena, submessage->GetArena());
1237 
1238  const FieldDescriptor* oneof_field =
1239  d->FindFieldByName("oneof_nested_message");
1240  submessage = static_cast<TestAllTypes::NestedMessage*>(
1241  r->MutableMessage(message, oneof_field));
1242  submessage_expected = message->mutable_oneof_nested_message();
1243 
1244  EXPECT_EQ(submessage_expected, submessage);
1245  EXPECT_EQ(&arena, submessage->GetArena());
1246 }
1247 #endif // PROTOBUF_RTTI
1248 
1249 
1250 void FillArenaAwareFields(TestAllTypes* message) {
1251  std::string test_string = "hello world";
1252  message->set_optional_int32(42);
1253  message->set_optional_string(test_string);
1254  message->set_optional_bytes(test_string);
1255  message->mutable_optional_nested_message()->set_bb(42);
1256 
1257  message->set_oneof_uint32(42);
1258  message->mutable_oneof_nested_message()->set_bb(42);
1259  message->set_oneof_string(test_string);
1260  message->set_oneof_bytes(test_string);
1261 
1262  message->add_repeated_int32(42);
1263  // No repeated string: not yet arena-aware.
1264  message->add_repeated_nested_message()->set_bb(42);
1265  message->mutable_optional_lazy_message()->set_bb(42);
1266 }
1267 
1268 // Test: no allocations occur on heap while touching all supported field types.
1269 TEST(ArenaTest, NoHeapAllocationsTest) {
1270  // Allocate a large initial block to avoid mallocs during hooked test.
1271  std::vector<char> arena_block(128 * 1024);
1272  ArenaOptions options;
1273  options.initial_block = &arena_block[0];
1274  options.initial_block_size = arena_block.size();
1275  Arena arena(options);
1276 
1277  {
1278 
1279  TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
1281  }
1282 
1283  arena.Reset();
1284 }
1285 
1286 TEST(ArenaTest, ParseCorruptedString) {
1287  TestAllTypes message;
1289  TestParseCorruptedString<TestAllTypes, true>(message);
1290  TestParseCorruptedString<TestAllTypes, false>(message);
1291 }
1292 
1293 #if PROTOBUF_RTTI
1294 // Test construction on an arena via generic MessageLite interface. We should be
1295 // able to successfully deserialize on the arena without incurring heap
1296 // allocations, i.e., everything should still be arena-allocation-aware.
1297 TEST(ArenaTest, MessageLiteOnArena) {
1298  std::vector<char> arena_block(128 * 1024);
1299  ArenaOptions options;
1300  options.initial_block = &arena_block[0];
1301  options.initial_block_size = arena_block.size();
1302  Arena arena(options);
1303  const MessageLite* prototype = &TestAllTypes::default_instance();
1304 
1305  TestAllTypes initial_message;
1306  FillArenaAwareFields(&initial_message);
1307  std::string serialized;
1308  initial_message.SerializeToString(&serialized);
1309 
1310  {
1311 
1312  MessageLite* generic_message = prototype->New(&arena);
1313  EXPECT_TRUE(generic_message != NULL);
1314  EXPECT_EQ(&arena, generic_message->GetArena());
1315  EXPECT_TRUE(generic_message->ParseFromString(serialized));
1316  TestAllTypes* deserialized = static_cast<TestAllTypes*>(generic_message);
1317  EXPECT_EQ(42, deserialized->optional_int32());
1318  }
1319 
1320  arena.Reset();
1321 }
1322 #endif // PROTOBUF_RTTI
1323 
1324 // RepeatedField should support non-POD types, and invoke constructors and
1325 // destructors appropriately, because it's used this way by lots of other code
1326 // (even if this was not its original intent).
1327 TEST(ArenaTest, RepeatedFieldWithNonPODType) {
1328  {
1329  RepeatedField<std::string> field_on_heap;
1330  for (int i = 0; i < 100; i++) {
1331  *field_on_heap.Add() = "test string long enough to exceed inline buffer";
1332  }
1333  }
1334  {
1335  Arena arena;
1336  RepeatedField<std::string> field_on_arena(&arena);
1337  for (int i = 0; i < 100; i++) {
1338  *field_on_arena.Add() = "test string long enough to exceed inline buffer";
1339  }
1340  }
1341 }
1342 
1343 // Align n to next multiple of 8
1344 uint64_t Align8(uint64_t n) { return (n + 7) & -8; }
1345 
1346 TEST(ArenaTest, SpaceAllocated_and_Used) {
1347  Arena arena_1;
1348  EXPECT_EQ(0, arena_1.SpaceAllocated());
1349  EXPECT_EQ(0, arena_1.SpaceUsed());
1350  EXPECT_EQ(0, arena_1.Reset());
1351  Arena::CreateArray<char>(&arena_1, 320);
1352  // Arena will allocate slightly more than 320 for the block headers.
1353  EXPECT_LE(320, arena_1.SpaceAllocated());
1354  EXPECT_EQ(Align8(320), arena_1.SpaceUsed());
1355  EXPECT_LE(320, arena_1.Reset());
1356 
1357  // Test with initial block.
1358  std::vector<char> arena_block(1024);
1359  ArenaOptions options;
1360  options.start_block_size = 256;
1361  options.max_block_size = 8192;
1362  options.initial_block = &arena_block[0];
1363  options.initial_block_size = arena_block.size();
1364  Arena arena_2(options);
1365  EXPECT_EQ(1024, arena_2.SpaceAllocated());
1366  EXPECT_EQ(0, arena_2.SpaceUsed());
1367  EXPECT_EQ(1024, arena_2.Reset());
1368  Arena::CreateArray<char>(&arena_2, 55);
1369  EXPECT_EQ(1024, arena_2.SpaceAllocated());
1370  EXPECT_EQ(Align8(55), arena_2.SpaceUsed());
1371  EXPECT_EQ(1024, arena_2.Reset());
1372 }
1373 
1374 TEST(ArenaTest, BlockSizeDoubling) {
1375  Arena arena;
1376  EXPECT_EQ(0, arena.SpaceUsed());
1377  EXPECT_EQ(0, arena.SpaceAllocated());
1378 
1379  // Allocate something to get initial block size.
1380  Arena::CreateArray<char>(&arena, 1);
1381  auto first_block_size = arena.SpaceAllocated();
1382 
1383  // Keep allocating until space used increases.
1384  while (arena.SpaceAllocated() == first_block_size) {
1385  Arena::CreateArray<char>(&arena, 1);
1386  }
1387  ASSERT_GT(arena.SpaceAllocated(), first_block_size);
1388  auto second_block_size = (arena.SpaceAllocated() - first_block_size);
1389 
1390  EXPECT_EQ(second_block_size, 2*first_block_size);
1391 }
1392 
1393 TEST(ArenaTest, Alignment) {
1394  Arena arena;
1395  for (int i = 0; i < 200; i++) {
1396  void* p = Arena::CreateArray<char>(&arena, i);
1397  GOOGLE_CHECK_EQ(reinterpret_cast<uintptr_t>(p) % 8, 0) << i << ": " << p;
1398  }
1399 }
1400 
1401 TEST(ArenaTest, BlockSizeSmallerThanAllocation) {
1402  for (size_t i = 0; i <= 8; ++i) {
1403  ArenaOptions opt;
1404  opt.start_block_size = opt.max_block_size = i;
1405  Arena arena(opt);
1406 
1407  *Arena::Create<int64_t>(&arena) = 42;
1408  EXPECT_GE(arena.SpaceAllocated(), 8);
1409  EXPECT_EQ(8, arena.SpaceUsed());
1410 
1411  *Arena::Create<int64_t>(&arena) = 42;
1412  EXPECT_GE(arena.SpaceAllocated(), 16);
1413  EXPECT_EQ(16, arena.SpaceUsed());
1414  }
1415 }
1416 
1417 TEST(ArenaTest, GetArenaShouldReturnTheArenaForArenaAllocatedMessages) {
1418  Arena arena;
1419  ArenaMessage* message = Arena::CreateMessage<ArenaMessage>(&arena);
1420  const ArenaMessage* const_pointer_to_message = message;
1422  EXPECT_EQ(&arena, Arena::GetArena(const_pointer_to_message));
1423 
1424  // Test that the Message* / MessageLite* specialization SFINAE works.
1425  const Message* const_pointer_to_message_type = message;
1426  EXPECT_EQ(&arena, Arena::GetArena(const_pointer_to_message_type));
1427  const MessageLite* const_pointer_to_message_lite_type = message;
1428  EXPECT_EQ(&arena, Arena::GetArena(const_pointer_to_message_lite_type));
1429 }
1430 
1431 TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaAllocatedMessages) {
1432  ArenaMessage message;
1433  const ArenaMessage* const_pointer_to_message = &message;
1435  EXPECT_EQ(NULL, Arena::GetArena(const_pointer_to_message));
1436 }
1437 
1438 TEST(ArenaTest, GetArenaShouldReturnNullForNonArenaCompatibleTypes) {
1439  // Test that GetArena returns nullptr for types that have a GetArena method
1440  // that doesn't return Arena*.
1441  struct {
1442  int GetArena() const { return 0; }
1443  } has_get_arena_method_wrong_return_type;
1444  EXPECT_EQ(nullptr, Arena::GetArena(&has_get_arena_method_wrong_return_type));
1445 
1446  // Test that GetArena returns nullptr for types that have a GetArena alias.
1447  struct {
1448  using GetArena = Arena*;
1449  GetArena unused;
1450  } has_get_arena_alias;
1451  EXPECT_EQ(nullptr, Arena::GetArena(&has_get_arena_alias));
1452 
1453  // Test that GetArena returns nullptr for types that have a GetArena data
1454  // member.
1455  struct {
1456  Arena GetArena;
1457  } has_get_arena_data_member;
1458  EXPECT_EQ(nullptr, Arena::GetArena(&has_get_arena_data_member));
1459 }
1460 
1461 TEST(ArenaTest, AddCleanup) {
1462  Arena arena;
1463  for (int i = 0; i < 100; i++) {
1464  arena.Own(new int);
1465  }
1466 }
1467 
1468 namespace {
1469 uint32_t hooks_num_init = 0;
1470 uint32_t hooks_num_allocations = 0;
1471 uint32_t hooks_num_reset = 0;
1472 uint32_t hooks_num_destruct = 0;
1473 
1474 void ClearHookCounts() {
1475  hooks_num_init = 0;
1476  hooks_num_allocations = 0;
1477  hooks_num_reset = 0;
1478  hooks_num_destruct = 0;
1479 }
1480 } // namespace
1481 
1482 // A helper utility class that handles arena callbacks.
1483 class ArenaOptionsTestFriend final : public internal::ArenaMetricsCollector {
1484  public:
1486  return new ArenaOptionsTestFriend(true);
1487  }
1488 
1490  return new ArenaOptionsTestFriend(false);
1491  }
1492 
1493  static void Enable(ArenaOptions* options) {
1494  ClearHookCounts();
1495  options->make_metrics_collector = &ArenaOptionsTestFriend::NewWithAllocs;
1496  }
1497 
1499  ClearHookCounts();
1500  options->make_metrics_collector = &ArenaOptionsTestFriend::NewWithoutAllocs;
1501  }
1502 
1503  explicit ArenaOptionsTestFriend(bool record_allocs)
1504  : ArenaMetricsCollector(record_allocs) {
1505  ++hooks_num_init;
1506  }
1507  void OnDestroy(uint64_t space_allocated) override {
1508  ++hooks_num_destruct;
1509  delete this;
1510  }
1511  void OnReset(uint64_t space_allocated) override { ++hooks_num_reset; }
1512  void OnAlloc(const std::type_info* allocated_type,
1513  uint64_t alloc_size) override {
1514  ++hooks_num_allocations;
1515  }
1516 };
1517 
1518 // Test the hooks are correctly called.
1519 TEST(ArenaTest, ArenaHooksSanity) {
1520  ArenaOptions options;
1522 
1523  // Scope for defining the arena
1524  {
1525  Arena arena(options);
1526  EXPECT_EQ(1, hooks_num_init);
1527  EXPECT_EQ(0, hooks_num_allocations);
1528  Arena::Create<uint64_t>(&arena);
1530  EXPECT_EQ(1, hooks_num_allocations);
1531  } else {
1532  EXPECT_EQ(2, hooks_num_allocations);
1533  }
1534  arena.Reset();
1535  arena.Reset();
1536  EXPECT_EQ(2, hooks_num_reset);
1537  }
1538  EXPECT_EQ(2, hooks_num_reset);
1539  EXPECT_EQ(1, hooks_num_destruct);
1540 }
1541 
1542 // Test that allocation hooks are not called when we don't need them.
1543 TEST(ArenaTest, ArenaHooksWhenAllocationsNotNeeded) {
1546 
1547  Arena arena(options);
1548  EXPECT_EQ(0, hooks_num_allocations);
1549  Arena::Create<uint64_t>(&arena);
1550  EXPECT_EQ(0, hooks_num_allocations);
1551 }
1552 
1553 
1554 } // namespace protobuf
1555 } // namespace google
1556 
1557 #include <google/protobuf/port_undef.inc>
EXPECT_FALSE
#define EXPECT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1970
google::protobuf::SimpleDataType::~SimpleDataType
virtual ~SimpleDataType()
Definition: protobuf/src/google/protobuf/arena_unittest.cc:87
google::protobuf::MustBeConstructedWithOneThroughEight::four_
const PleaseDontCopyMe * four_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:146
absl::swap_internal::Swap
void Swap(T &lhs, T &rhs) noexcept(IsNothrowSwappable< T >::value)
Definition: abseil-cpp/absl/meta/type_traits.h:772
google::protobuf.internal::GetArena
Arena * GetArena(MessageLite *msg, int64 arena_offset)
Definition: bloaty/third_party/protobuf/src/google/protobuf/generated_message_table_driven_lite.h:86
google::protobuf::FieldDescriptor
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.h:515
google::protobuf::ArenaOptionsTestFriend::OnReset
void OnReset(uint64_t space_allocated) override
Definition: protobuf/src/google/protobuf/arena_unittest.cc:1511
google::protobuf::TestSwapRepeatedField
void TestSwapRepeatedField(Arena *arena1, Arena *arena2)
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:970
memset
return memset(p, 0, total)
ASSERT_STREQ
#define ASSERT_STREQ(s1, s2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2104
google::protobuf::SimpleDataType::SetNotifier
void SetNotifier(Notifier *notifier)
Definition: protobuf/src/google/protobuf/arena_unittest.cc:86
options
double_dict options[]
Definition: capstone_test.c:55
google::protobuf::Align8
uint64 Align8(uint64 n)
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:1245
google::protobuf::PleaseMoveMe::value_
std::string value_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:263
Arena
Definition: arena.c:39
GOOGLE_CHECK_EQ
#define GOOGLE_CHECK_EQ(A, B)
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/logging.h:156
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
google::protobuf
Definition: bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:12
absl::FormatConversionChar::s
@ s
EXPECT_LE
#define EXPECT_LE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2030
xds_manager.p
p
Definition: xds_manager.py:60
google::protobuf::FillArenaAwareFields
void FillArenaAwareFields(TestAllTypes *message)
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:1150
google::protobuf::Reflection
Definition: bloaty/third_party/protobuf/src/google/protobuf/message.h:397
message
char * message
Definition: libuv/docs/code/tty-gravity/main.c:12
google::protobuf::MustBeConstructedWithOneThroughFour::two_
const char *const two_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:117
repeated_field
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern repeated_field
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/array.c:486
Descriptor
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:121
arena
grpc_core::ScopedArenaPtr arena
Definition: binder_transport_test.cc:237
tests.google.protobuf.internal.test_util.SetAllFields
def SetAllFields(message)
Definition: bloaty/third_party/protobuf/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/test_util.py:182
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
google::protobuf::Notifier::Notify
void Notify()
Definition: protobuf/src/google/protobuf/arena_unittest.cc:76
FieldDescriptor
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:133
google::protobuf::PleaseMoveMe::value
const std::string & value() const
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:260
google::protobuf::ArenaOptionsTestFriend::ArenaOptionsTestFriend
ArenaOptionsTestFriend(bool record_allocs)
Definition: protobuf/src/google/protobuf/arena_unittest.cc:1503
autogen_x86imm.f
f
Definition: autogen_x86imm.py:9
google::protobuf::MustBeConstructedWithOneThroughEight::one_
int one_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:143
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
google::protobuf::MustBeConstructedWithOneThroughFour::GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughFour)
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
gmock_output_test.output
output
Definition: bloaty/third_party/googletest/googlemock/test/gmock_output_test.py:175
EXPECT_NE
#define EXPECT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2028
google::protobuf::MustBeConstructedWithOneThroughFour::three_
std::string three_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:118
google::protobuf::ArenaOptionsTestFriend::OnDestroy
void OnDestroy(uint64_t space_allocated) override
Definition: protobuf/src/google/protobuf/arena_unittest.cc:1507
grpc::protobuf::MessageLite
GRPC_CUSTOM_MESSAGELITE MessageLite
Definition: include/grpcpp/impl/codegen/config_protobuf.h:79
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
google::protobuf::ArenaOptionsTestFriend::EnableWithoutAllocs
static void EnableWithoutAllocs(ArenaOptions *options)
Definition: protobuf/src/google/protobuf/arena_unittest.cc:1498
google::protobuf::MustBeConstructedWithOneThroughEight::two_
const char *const two_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:144
google::protobuf::MustBeConstructedWithOneThroughEight::eight_
std::string eight_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:150
tests.google.protobuf.internal.test_util.ExpectAllFieldsSet
def ExpectAllFieldsSet(test_case, message)
Definition: bloaty/third_party/protobuf/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/test_util.py:367
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
google::protobuf::TEST
TEST(ArenaTest, ArenaConstructable)
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:156
uintptr_t
_W64 unsigned int uintptr_t
Definition: stdint-msvc2008.h:119
google::protobuf::Notifier::GetCount
int GetCount()
Definition: protobuf/src/google/protobuf/arena_unittest.cc:77
google::protobuf::ArenaOptionsTestFriend::Enable
static void Enable(ArenaOptions *options)
Definition: protobuf/src/google/protobuf/arena_unittest.cc:1493
google::protobuf::Notifier::count_
int count_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:78
google::protobuf::ArenaOptionsTestFriend::OnAlloc
void OnAlloc(const std::type_info *allocated_type, uint64_t alloc_size) override
Definition: protobuf/src/google/protobuf/arena_unittest.cc:1512
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
google::protobuf::MustBeConstructedWithOneThroughEight::seven_
std::string seven_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:149
nested
static int nested
Definition: test-callback-stack.c:39
google::protobuf::MustBeConstructedWithOneThroughFour::MustBeConstructedWithOneThroughFour
MustBeConstructedWithOneThroughFour(int one, const char *two, const std::string &three, const PleaseDontCopyMe *four)
Definition: protobuf/src/google/protobuf/arena_unittest.cc:113
google::protobuf::MustBeConstructedWithOneThroughEight::six_
const char *const six_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:148
google::protobuf::SimpleDataType::SimpleDataType
SimpleDataType()
Definition: protobuf/src/google/protobuf/arena_unittest.cc:85
google::protobuf::Notifier
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:71
value
const char * value
Definition: hpack_parser_table.cc:165
google::protobuf::SimpleDataType::notifier_
Notifier * notifier_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:89
google::protobuf::MustBeConstructedWithOneThroughFour::one_
int one_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:116
google::protobuf::MustBeConstructedWithOneThroughEight::GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughEight)
google::protobuf::ArenaOptions
Definition: third_party/bloaty/third_party/protobuf/src/google/protobuf/arena.h:117
google::protobuf::PleaseMoveMe
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:254
field
const FieldDescriptor * field
Definition: bloaty/third_party/protobuf/src/google/protobuf/compiler/parser_unittest.cc:2692
google::protobuf::Notifier::Notifier
Notifier()
Definition: protobuf/src/google/protobuf/arena_unittest.cc:75
OneofDescriptor
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:138
google::protobuf::MustBeConstructedWithOneThroughEight::MustBeConstructedWithOneThroughEight
MustBeConstructedWithOneThroughEight(int one, const char *two, const std::string &three, const PleaseDontCopyMe *four, int five, const char *six, const std::string &seven, const std::string &eight)
Definition: protobuf/src/google/protobuf/arena_unittest.cc:130
UnknownFields
std::vector< UnknownField > UnknownFields
Definition: upb/upb/util/compare_test.cc:41
google::protobuf::ArenaOptionsTestFriend::NewWithoutAllocs
static internal::ArenaMetricsCollector * NewWithoutAllocs()
Definition: protobuf/src/google/protobuf/arena_unittest.cc:1489
absl::str_format_internal::LengthMod::t
@ t
google::protobuf::PleaseDontCopyMe::value
int value() const
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:101
google::protobuf::PleaseDontCopyMe::PleaseDontCopyMe
PleaseDontCopyMe(int value)
Definition: protobuf/src/google/protobuf/arena_unittest.cc:101
profile_analyzer.fields
list fields
Definition: profile_analyzer.py:266
fix_build_deps.r
r
Definition: fix_build_deps.py:491
google::protobuf::MustBeConstructedWithOneThroughEight
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:126
google::protobuf::ArenaOptionsTestFriend::NewWithAllocs
static internal::ArenaMetricsCollector * NewWithAllocs()
Definition: protobuf/src/google/protobuf/arena_unittest.cc:1485
ASSERT_TRUE
#define ASSERT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1973
google::protobuf::Descriptor
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.h:231
desc
#define desc
Definition: bloaty/third_party/protobuf/src/google/protobuf/extension_set.h:338
EXPECT_GE
#define EXPECT_GE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2034
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
make_curve25519_tables.d
int d
Definition: make_curve25519_tables.py:53
ASSERT_GT
#define ASSERT_GT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2076
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
google::protobuf::PleaseDontCopyMe
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:97
google::protobuf::MustBeConstructedWithOneThroughEight::three_
std::string three_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:145
google::protobuf::PleaseMoveMe::PleaseMoveMe
PleaseMoveMe(const std::string &value)
Definition: protobuf/src/google/protobuf/arena_unittest.cc:256
int32_t
signed int int32_t
Definition: stdint-msvc2008.h:77
google::protobuf.internal::ArenaMetricsCollector
Definition: protobuf/src/google/protobuf/arena_impl.h:62
google::protobuf::MustBeConstructedWithOneThroughEight::five_
int five_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:147
google::protobuf::MustBeConstructedWithOneThroughFour
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:109
google
Definition: bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:11
google::protobuf::PleaseDontCopyMe::value_
int value_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:104
google::protobuf::PleaseDontCopyMe::GOOGLE_DISALLOW_EVIL_CONSTRUCTORS
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PleaseDontCopyMe)
Message
Definition: protobuf/php/ext/google/protobuf/message.c:53
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2056
google::protobuf::MustBeConstructedWithOneThroughFour::four_
const PleaseDontCopyMe * four_
Definition: bloaty/third_party/protobuf/src/google/protobuf/arena_unittest.cc:119
RepeatedField
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:403


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:42