ranges_manager_unittest.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/metrics/ranges_manager.h"
  5. #include <vector>
  6. #include "testing/gmock/include/gmock/gmock.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace base {
  9. using testing::UnorderedElementsAre;
  10. TEST(RangesManagerTest, RegisterBucketRanges) {
  11. RangesManager ranges_manager;
  12. // Create some BucketRanges. We call |ResetChecksum| to calculate and set
  13. // their checksums. Checksums are used to validate integrity (and test for
  14. // non-equivalence) and should be computed after a BucketRanges is fully
  15. // initialized. Note that BucketRanges are initialized with 0 for all ranges,
  16. // i.e., all buckets will be [0, 0).
  17. BucketRanges* ranges1 = new BucketRanges(3);
  18. ranges1->ResetChecksum();
  19. BucketRanges* ranges2 = new BucketRanges(4);
  20. ranges2->ResetChecksum();
  21. // Register new ranges.
  22. EXPECT_EQ(ranges1, ranges_manager.RegisterOrDeleteDuplicateRanges(ranges1));
  23. EXPECT_EQ(ranges2, ranges_manager.RegisterOrDeleteDuplicateRanges(ranges2));
  24. EXPECT_THAT(ranges_manager.GetBucketRanges(),
  25. UnorderedElementsAre(ranges1, ranges2));
  26. // Register |ranges1| again. The registered BucketRanges set should not change
  27. // as |ranges1| is already registered.
  28. EXPECT_EQ(ranges1, ranges_manager.RegisterOrDeleteDuplicateRanges(ranges1));
  29. EXPECT_THAT(ranges_manager.GetBucketRanges(),
  30. UnorderedElementsAre(ranges1, ranges2));
  31. // Make sure |ranges1| still exists, and is the same as what we expect (all
  32. // ranges are 0).
  33. ASSERT_EQ(3u, ranges1->size());
  34. EXPECT_EQ(0, ranges1->range(0));
  35. EXPECT_EQ(0, ranges1->range(1));
  36. EXPECT_EQ(0, ranges1->range(2));
  37. // Register a new |ranges3| that is equivalent to |ranges1| (same ranges). We
  38. // expect that |ranges3| is deleted (verified by LeakSanitizer bots) and that
  39. // |ranges1| is returned by |RegisterOrDeleteDuplicateRanges|.
  40. BucketRanges* ranges3 = new BucketRanges(3);
  41. ranges3->ResetChecksum();
  42. EXPECT_EQ(ranges1, ranges_manager.RegisterOrDeleteDuplicateRanges(ranges3));
  43. EXPECT_THAT(ranges_manager.GetBucketRanges(),
  44. UnorderedElementsAre(ranges1, ranges2));
  45. }
  46. TEST(RangesManagerTest, ReleaseBucketRangesOnDestroy) {
  47. std::unique_ptr<RangesManager> ranges_manager =
  48. std::make_unique<RangesManager>();
  49. // Create a BucketRanges. We call |ResetChecksum| to calculate and set its
  50. // checksum. Checksums are used to validate integrity (and test for
  51. // non-equivalence) and should be computed after a BucketRanges is fully
  52. // initialized. Note that BucketRanges are initialized with 0 for all ranges,
  53. // i.e., all buckets will be [0, 0).
  54. BucketRanges* ranges = new BucketRanges(1);
  55. ranges->ResetChecksum();
  56. // Register new range.
  57. EXPECT_EQ(ranges, ranges_manager->RegisterOrDeleteDuplicateRanges(ranges));
  58. EXPECT_THAT(ranges_manager->GetBucketRanges(), UnorderedElementsAre(ranges));
  59. // Explicitly destroy |ranges_manager|.
  60. ranges_manager.reset();
  61. // LeakSanitizer (lsan) bots will verify that |ranges| will be properly
  62. // released after destroying |ranges_manager|.
  63. }
  64. } // namespace base