// Copyright 2022 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/metrics/ranges_manager.h" #include #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { using testing::UnorderedElementsAre; TEST(RangesManagerTest, RegisterBucketRanges) { RangesManager ranges_manager; // Create some BucketRanges. We call |ResetChecksum| to calculate and set // their checksums. Checksums are used to validate integrity (and test for // non-equivalence) and should be computed after a BucketRanges is fully // initialized. Note that BucketRanges are initialized with 0 for all ranges, // i.e., all buckets will be [0, 0). BucketRanges* ranges1 = new BucketRanges(3); ranges1->ResetChecksum(); BucketRanges* ranges2 = new BucketRanges(4); ranges2->ResetChecksum(); // Register new ranges. EXPECT_EQ(ranges1, ranges_manager.RegisterOrDeleteDuplicateRanges(ranges1)); EXPECT_EQ(ranges2, ranges_manager.RegisterOrDeleteDuplicateRanges(ranges2)); EXPECT_THAT(ranges_manager.GetBucketRanges(), UnorderedElementsAre(ranges1, ranges2)); // Register |ranges1| again. The registered BucketRanges set should not change // as |ranges1| is already registered. EXPECT_EQ(ranges1, ranges_manager.RegisterOrDeleteDuplicateRanges(ranges1)); EXPECT_THAT(ranges_manager.GetBucketRanges(), UnorderedElementsAre(ranges1, ranges2)); // Make sure |ranges1| still exists, and is the same as what we expect (all // ranges are 0). ASSERT_EQ(3u, ranges1->size()); EXPECT_EQ(0, ranges1->range(0)); EXPECT_EQ(0, ranges1->range(1)); EXPECT_EQ(0, ranges1->range(2)); // Register a new |ranges3| that is equivalent to |ranges1| (same ranges). We // expect that |ranges3| is deleted (verified by LeakSanitizer bots) and that // |ranges1| is returned by |RegisterOrDeleteDuplicateRanges|. BucketRanges* ranges3 = new BucketRanges(3); ranges3->ResetChecksum(); EXPECT_EQ(ranges1, ranges_manager.RegisterOrDeleteDuplicateRanges(ranges3)); EXPECT_THAT(ranges_manager.GetBucketRanges(), UnorderedElementsAre(ranges1, ranges2)); } TEST(RangesManagerTest, ReleaseBucketRangesOnDestroy) { std::unique_ptr ranges_manager = std::make_unique(); // Create a BucketRanges. We call |ResetChecksum| to calculate and set its // checksum. Checksums are used to validate integrity (and test for // non-equivalence) and should be computed after a BucketRanges is fully // initialized. Note that BucketRanges are initialized with 0 for all ranges, // i.e., all buckets will be [0, 0). BucketRanges* ranges = new BucketRanges(1); ranges->ResetChecksum(); // Register new range. EXPECT_EQ(ranges, ranges_manager->RegisterOrDeleteDuplicateRanges(ranges)); EXPECT_THAT(ranges_manager->GetBucketRanges(), UnorderedElementsAre(ranges)); // Explicitly destroy |ranges_manager|. ranges_manager.reset(); // LeakSanitizer (lsan) bots will verify that |ranges| will be properly // released after destroying |ranges_manager|. } } // namespace base