1 // Copyright (c) 2012 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 5 #include "base/metrics/sample_map.h" 6 7 #include <memory> 8 9 #include "base/test/gtest_util.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 namespace base { 13 namespace { 14 15 TEST(SampleMapTest, AccumulateTest) { 16 SampleMap samples(1); 17 18 samples.Accumulate(1, 100); 19 samples.Accumulate(2, 200); 20 samples.Accumulate(1, -200); 21 EXPECT_EQ(-100, samples.GetCount(1)); 22 EXPECT_EQ(200, samples.GetCount(2)); 23 24 EXPECT_EQ(300, samples.sum()); 25 EXPECT_EQ(100, samples.TotalCount()); 26 EXPECT_EQ(samples.redundant_count(), samples.TotalCount()); 27 } 28 29 TEST(SampleMapTest, Accumulate_LargeValuesDontOverflow) { 30 SampleMap samples(1); 31 32 samples.Accumulate(250000000, 100); 33 samples.Accumulate(500000000, 200); 34 samples.Accumulate(250000000, -200); 35 EXPECT_EQ(-100, samples.GetCount(250000000)); 36 EXPECT_EQ(200, samples.GetCount(500000000)); 37 38 EXPECT_EQ(75000000000LL, samples.sum()); 39 EXPECT_EQ(100, samples.TotalCount()); 40 EXPECT_EQ(samples.redundant_count(), samples.TotalCount()); 41 } 42 43 TEST(SampleMapTest, AddSubtractTest) { 44 SampleMap samples1(1); 45 SampleMap samples2(2); 46 47 samples1.Accumulate(1, 100); 48 samples1.Accumulate(2, 100); 49 samples1.Accumulate(3, 100); 50 51 samples2.Accumulate(1, 200); 52 samples2.Accumulate(2, 200); 53 samples2.Accumulate(4, 200); 54 55 samples1.Add(samples2); 56 EXPECT_EQ(300, samples1.GetCount(1)); 57 EXPECT_EQ(300, samples1.GetCount(2)); 58 EXPECT_EQ(100, samples1.GetCount(3)); 59 EXPECT_EQ(200, samples1.GetCount(4)); 60 EXPECT_EQ(2000, samples1.sum()); 61 EXPECT_EQ(900, samples1.TotalCount()); 62 EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount()); 63 64 samples1.Subtract(samples2); 65 EXPECT_EQ(100, samples1.GetCount(1)); 66 EXPECT_EQ(100, samples1.GetCount(2)); 67 EXPECT_EQ(100, samples1.GetCount(3)); 68 EXPECT_EQ(0, samples1.GetCount(4)); 69 EXPECT_EQ(600, samples1.sum()); 70 EXPECT_EQ(300, samples1.TotalCount()); 71 EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount()); 72 } 73 74 TEST(SampleMapIteratorTest, IterateTest) { 75 SampleMap samples(1); 76 samples.Accumulate(1, 100); 77 samples.Accumulate(2, 200); 78 samples.Accumulate(4, -300); 79 samples.Accumulate(5, 0); 80 81 std::unique_ptr<SampleCountIterator> it = samples.Iterator(); 82 83 HistogramBase::Sample min; 84 HistogramBase::Sample max; 85 HistogramBase::Count count; 86 87 it->Get(&min, &max, &count); 88 EXPECT_EQ(1, min); 89 EXPECT_EQ(2, max); 90 EXPECT_EQ(100, count); 91 EXPECT_FALSE(it->GetBucketIndex(NULL)); 92 93 it->Next(); 94 it->Get(&min, &max, &count); 95 EXPECT_EQ(2, min); 96 EXPECT_EQ(3, max); 97 EXPECT_EQ(200, count); 98 99 it->Next(); 100 it->Get(&min, &max, &count); 101 EXPECT_EQ(4, min); 102 EXPECT_EQ(5, max); 103 EXPECT_EQ(-300, count); 104 105 it->Next(); 106 EXPECT_TRUE(it->Done()); 107 } 108 109 TEST(SampleMapIteratorTest, SkipEmptyRanges) { 110 SampleMap samples(1); 111 samples.Accumulate(5, 1); 112 samples.Accumulate(10, 2); 113 samples.Accumulate(15, 3); 114 samples.Accumulate(20, 4); 115 samples.Accumulate(25, 5); 116 117 SampleMap samples2(2); 118 samples2.Accumulate(5, 1); 119 samples2.Accumulate(20, 4); 120 samples2.Accumulate(25, 5); 121 122 samples.Subtract(samples2); 123 124 std::unique_ptr<SampleCountIterator> it = samples.Iterator(); 125 EXPECT_FALSE(it->Done()); 126 127 HistogramBase::Sample min; 128 HistogramBase::Sample max; 129 HistogramBase::Count count; 130 131 it->Get(&min, &max, &count); 132 EXPECT_EQ(10, min); 133 EXPECT_EQ(11, max); 134 EXPECT_EQ(2, count); 135 136 it->Next(); 137 EXPECT_FALSE(it->Done()); 138 139 it->Get(&min, &max, &count); 140 EXPECT_EQ(15, min); 141 EXPECT_EQ(16, max); 142 EXPECT_EQ(3, count); 143 144 it->Next(); 145 EXPECT_TRUE(it->Done()); 146 } 147 148 TEST(SampleMapIteratorDeathTest, IterateDoneTest) { 149 SampleMap samples(1); 150 151 std::unique_ptr<SampleCountIterator> it = samples.Iterator(); 152 153 EXPECT_TRUE(it->Done()); 154 155 HistogramBase::Sample min; 156 HistogramBase::Sample max; 157 HistogramBase::Count count; 158 EXPECT_DCHECK_DEATH(it->Get(&min, &max, &count)); 159 160 EXPECT_DCHECK_DEATH(it->Next()); 161 162 samples.Accumulate(1, 100); 163 it = samples.Iterator(); 164 EXPECT_FALSE(it->Done()); 165 } 166 167 } // namespace 168 } // namespace base 169