circular_buffer_counter_test.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <cstdint>
  5. #include <limits>
  6. #include <string>
  7. #include "opentelemetry/sdk/metrics/data/circular_buffer.h"
  8. using namespace opentelemetry::sdk::metrics;
  9. class AdaptingIntegerArrayTest : public testing::TestWithParam<uint64_t>
  10. {};
  11. INSTANTIATE_TEST_SUITE_P(InterestingValues,
  12. AdaptingIntegerArrayTest,
  13. testing::Values<uint64_t>(1,
  14. std::numeric_limits<uint8_t>::max() + 1ull,
  15. std::numeric_limits<uint16_t>::max() + 1ull,
  16. std::numeric_limits<uint32_t>::max() + 1ull));
  17. TEST_P(AdaptingIntegerArrayTest, PreservesSizeOnEnlargement)
  18. {
  19. AdaptingIntegerArray counter(10);
  20. EXPECT_EQ(counter.Size(), 10);
  21. counter.Increment(0, GetParam());
  22. EXPECT_EQ(counter.Size(), 10);
  23. }
  24. TEST_P(AdaptingIntegerArrayTest, IncrementAndGet)
  25. {
  26. AdaptingIntegerArray counter(10);
  27. for (int idx = 0; idx < 10; idx += 1)
  28. {
  29. EXPECT_EQ(counter.Get(idx), 0);
  30. counter.Increment(idx, 1);
  31. EXPECT_EQ(counter.Get(idx), 1);
  32. counter.Increment(idx, GetParam());
  33. EXPECT_EQ(counter.Get(idx), GetParam() + 1);
  34. }
  35. }
  36. TEST_P(AdaptingIntegerArrayTest, Copy)
  37. {
  38. AdaptingIntegerArray counter(10);
  39. counter.Increment(0, GetParam());
  40. EXPECT_EQ(counter.Get(0), GetParam());
  41. AdaptingIntegerArray copy = counter;
  42. EXPECT_EQ(copy.Get(0), GetParam());
  43. counter.Increment(0, 1);
  44. EXPECT_EQ(counter.Get(0), GetParam() + 1);
  45. EXPECT_EQ(copy.Get(0), GetParam());
  46. }
  47. TEST_P(AdaptingIntegerArrayTest, Clear)
  48. {
  49. AdaptingIntegerArray counter(10);
  50. counter.Increment(0, GetParam());
  51. EXPECT_EQ(counter.Get(0), GetParam());
  52. counter.Clear();
  53. counter.Increment(0, 1);
  54. EXPECT_EQ(counter.Get(0), 1);
  55. }
  56. TEST(AdaptingCircularBufferCounterTest, ReturnsZeroOutsidePopulatedRange)
  57. {
  58. AdaptingCircularBufferCounter counter{10};
  59. EXPECT_EQ(counter.Get(0), 0);
  60. EXPECT_EQ(counter.Get(100), 0);
  61. counter.Increment(2, 1);
  62. counter.Increment(99, 1);
  63. EXPECT_EQ(counter.Get(0), 0);
  64. EXPECT_EQ(counter.Get(100), 0);
  65. }
  66. TEST(AdaptingCircularBufferCounterTest, ExpandLower)
  67. {
  68. AdaptingCircularBufferCounter counter{160};
  69. EXPECT_TRUE(counter.Increment(10, 1));
  70. // Add BEFORE the initial see (array index 0) and make sure we wrap around the datastructure.
  71. EXPECT_TRUE(counter.Increment(0, 1));
  72. EXPECT_EQ(counter.Get(10), 1);
  73. EXPECT_EQ(counter.Get(0), 1);
  74. EXPECT_EQ(counter.StartIndex(), 0);
  75. EXPECT_EQ(counter.EndIndex(), 10);
  76. // Add AFTER initial entry and just push back end.
  77. EXPECT_TRUE(counter.Increment(20, 1));
  78. EXPECT_EQ(counter.Get(20), 1);
  79. EXPECT_EQ(counter.Get(10), 1);
  80. EXPECT_EQ(counter.Get(0), 1);
  81. EXPECT_EQ(counter.StartIndex(), 0);
  82. EXPECT_EQ(counter.EndIndex(), 20);
  83. }
  84. TEST(AdaptingCircularBufferCounterTest, ShouldFailAtLimit)
  85. {
  86. AdaptingCircularBufferCounter counter{10};
  87. EXPECT_TRUE(counter.Increment(10, 1));
  88. EXPECT_TRUE(counter.Increment(15, 2));
  89. EXPECT_TRUE(counter.Increment(6, 3));
  90. // Check state
  91. EXPECT_EQ(counter.StartIndex(), 6);
  92. EXPECT_EQ(counter.EndIndex(), 15);
  93. EXPECT_EQ(counter.Get(6), 3);
  94. EXPECT_EQ(counter.Get(10), 1);
  95. EXPECT_EQ(counter.Get(15), 2);
  96. // Adding over the maximum # of buckets
  97. EXPECT_FALSE(counter.Increment(5, 1));
  98. EXPECT_FALSE(counter.Increment(16, 1));
  99. }
  100. TEST(AdaptingCircularBufferCounterTest, ShouldCopyCounters)
  101. {
  102. AdaptingCircularBufferCounter counter{2};
  103. EXPECT_TRUE(counter.Increment(2, 1));
  104. EXPECT_TRUE(counter.Increment(1, 1));
  105. EXPECT_FALSE(counter.Increment(3, 1));
  106. AdaptingCircularBufferCounter copy{counter};
  107. EXPECT_EQ(counter.Get(2), 1);
  108. EXPECT_EQ(copy.Get(2), 1);
  109. EXPECT_EQ(copy.MaxSize(), counter.MaxSize());
  110. EXPECT_EQ(copy.StartIndex(), counter.StartIndex());
  111. EXPECT_EQ(copy.EndIndex(), counter.EndIndex());
  112. // Mutate copy and make sure original is unchanged.
  113. EXPECT_TRUE(copy.Increment(2, 1));
  114. EXPECT_EQ(copy.Get(2), 2);
  115. EXPECT_EQ(counter.Get(2), 1);
  116. }
  117. TEST(AdaptingCircularBufferCounterTest, Clear)
  118. {
  119. AdaptingCircularBufferCounter counter{10};
  120. EXPECT_TRUE(counter.Empty());
  121. EXPECT_TRUE(counter.Increment(2, 1));
  122. EXPECT_FALSE(counter.Empty());
  123. EXPECT_TRUE(counter.Increment(8, 1));
  124. // Check state.
  125. EXPECT_EQ(counter.StartIndex(), 2);
  126. EXPECT_EQ(counter.EndIndex(), 8);
  127. EXPECT_EQ(counter.Get(2), 1);
  128. EXPECT_EQ(counter.Get(8), 1);
  129. // Clear and verify.
  130. EXPECT_FALSE(counter.Empty());
  131. counter.Clear();
  132. EXPECT_TRUE(counter.Empty());
  133. }