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