chunked_vector_test.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright 2021 gRPC authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "src/core/lib/gprpp/chunked_vector.h"
  15. #include <gtest/gtest.h>
  16. #include "src/core/lib/resource_quota/resource_quota.h"
  17. namespace grpc_core {
  18. namespace testing {
  19. static auto* g_memory_allocator = new MemoryAllocator(
  20. ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator("test"));
  21. static constexpr size_t kInitialArenaSize = 1024;
  22. static constexpr size_t kChunkSize = 3;
  23. TEST(ChunkedVector, Noop) {
  24. auto arena = MakeScopedArena(kInitialArenaSize, g_memory_allocator);
  25. ChunkedVector<int, kChunkSize> v(arena.get());
  26. EXPECT_EQ(0, v.size());
  27. }
  28. TEST(ChunkedVector, Stack) {
  29. auto arena = MakeScopedArena(kInitialArenaSize, g_memory_allocator);
  30. ChunkedVector<int, kChunkSize> v(arena.get());
  31. // Populate 2 chunks of memory, and 2/3 of a final chunk.
  32. EXPECT_EQ(0, v.size());
  33. v.EmplaceBack(1);
  34. EXPECT_EQ(1, v.size());
  35. v.EmplaceBack(2);
  36. EXPECT_EQ(2, v.size());
  37. v.EmplaceBack(3);
  38. EXPECT_EQ(3, v.size());
  39. v.EmplaceBack(4);
  40. EXPECT_EQ(4, v.size());
  41. v.EmplaceBack(5);
  42. EXPECT_EQ(5, v.size());
  43. v.EmplaceBack(6);
  44. EXPECT_EQ(6, v.size());
  45. v.EmplaceBack(7);
  46. EXPECT_EQ(7, v.size());
  47. v.EmplaceBack(8);
  48. EXPECT_EQ(8, v.size());
  49. // Now pop all of them out and check the expected ordering.
  50. EXPECT_EQ(8, v.PopBack());
  51. EXPECT_EQ(7, v.size());
  52. EXPECT_EQ(7, v.PopBack());
  53. EXPECT_EQ(6, v.size());
  54. EXPECT_EQ(6, v.PopBack());
  55. EXPECT_EQ(5, v.size());
  56. EXPECT_EQ(5, v.PopBack());
  57. EXPECT_EQ(4, v.size());
  58. EXPECT_EQ(4, v.PopBack());
  59. EXPECT_EQ(3, v.size());
  60. EXPECT_EQ(3, v.PopBack());
  61. EXPECT_EQ(2, v.size());
  62. EXPECT_EQ(2, v.PopBack());
  63. EXPECT_EQ(1, v.size());
  64. EXPECT_EQ(1, v.PopBack());
  65. EXPECT_EQ(0, v.size());
  66. }
  67. TEST(ChunkedVector, Iterate) {
  68. auto arena = MakeScopedArena(kInitialArenaSize, g_memory_allocator);
  69. ChunkedVector<int, kChunkSize> v(arena.get());
  70. v.EmplaceBack(1);
  71. v.EmplaceBack(2);
  72. v.EmplaceBack(3);
  73. v.EmplaceBack(4);
  74. v.EmplaceBack(5);
  75. v.EmplaceBack(6);
  76. v.EmplaceBack(7);
  77. v.EmplaceBack(8);
  78. auto it = v.begin();
  79. EXPECT_EQ(1, *it);
  80. ++it;
  81. EXPECT_EQ(2, *it);
  82. ++it;
  83. EXPECT_EQ(3, *it);
  84. ++it;
  85. EXPECT_EQ(4, *it);
  86. ++it;
  87. EXPECT_EQ(5, *it);
  88. ++it;
  89. EXPECT_EQ(6, *it);
  90. ++it;
  91. EXPECT_EQ(7, *it);
  92. ++it;
  93. EXPECT_EQ(8, *it);
  94. ++it;
  95. EXPECT_EQ(v.end(), it);
  96. }
  97. TEST(ChunkedVector, ConstIterate) {
  98. auto arena = MakeScopedArena(kInitialArenaSize, g_memory_allocator);
  99. ChunkedVector<int, kChunkSize> v(arena.get());
  100. v.EmplaceBack(1);
  101. v.EmplaceBack(2);
  102. v.EmplaceBack(3);
  103. v.EmplaceBack(4);
  104. v.EmplaceBack(5);
  105. v.EmplaceBack(6);
  106. v.EmplaceBack(7);
  107. v.EmplaceBack(8);
  108. auto it = v.cbegin();
  109. EXPECT_EQ(1, *it);
  110. ++it;
  111. EXPECT_EQ(2, *it);
  112. ++it;
  113. EXPECT_EQ(3, *it);
  114. ++it;
  115. EXPECT_EQ(4, *it);
  116. ++it;
  117. EXPECT_EQ(5, *it);
  118. ++it;
  119. EXPECT_EQ(6, *it);
  120. ++it;
  121. EXPECT_EQ(7, *it);
  122. ++it;
  123. EXPECT_EQ(8, *it);
  124. ++it;
  125. EXPECT_EQ(v.cend(), it);
  126. }
  127. TEST(ChunkedVector, Clear) {
  128. auto arena = MakeScopedArena(kInitialArenaSize, g_memory_allocator);
  129. ChunkedVector<int, kChunkSize> v(arena.get());
  130. v.EmplaceBack(1);
  131. EXPECT_EQ(v.size(), 1);
  132. v.Clear();
  133. EXPECT_EQ(v.size(), 0);
  134. EXPECT_EQ(v.begin(), v.end());
  135. }
  136. TEST(ChunkedVector, RemoveIf) {
  137. auto arena = MakeScopedArena(kInitialArenaSize, g_memory_allocator);
  138. ChunkedVector<int, kChunkSize> v(arena.get());
  139. v.EmplaceBack(1);
  140. v.SetEnd(std::remove_if(v.begin(), v.end(), [](int i) { return i == 1; }));
  141. EXPECT_EQ(v.size(), 0);
  142. }
  143. } // namespace testing
  144. } // namespace grpc_core
  145. int main(int argc, char** argv) {
  146. ::testing::InitGoogleTest(&argc, argv);
  147. return RUN_ALL_TESTS();
  148. }