histogram_functions_unittest.cc 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // Copyright 2016 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/histogram_functions.h"
  5. #include "base/metrics/histogram_macros.h"
  6. #include "base/test/metrics/histogram_tester.h"
  7. #include "base/time/time.h"
  8. #include "testing/gmock/include/gmock/gmock.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. namespace base {
  11. enum UmaHistogramTestingEnum {
  12. UMA_HISTOGRAM_TESTING_ENUM_FIRST,
  13. UMA_HISTOGRAM_TESTING_ENUM_SECOND,
  14. UMA_HISTOGRAM_TESTING_ENUM_THIRD
  15. };
  16. TEST(HistogramFunctionsTest, ExactLinear) {
  17. std::string histogram("Testing.UMA.HistogramExactLinear");
  18. HistogramTester tester;
  19. UmaHistogramExactLinear(histogram, 10, 100);
  20. tester.ExpectUniqueSample(histogram, 10, 1);
  21. UmaHistogramExactLinear(histogram, 20, 100);
  22. UmaHistogramExactLinear(histogram, 10, 100);
  23. tester.ExpectBucketCount(histogram, 10, 2);
  24. tester.ExpectBucketCount(histogram, 20, 1);
  25. tester.ExpectTotalCount(histogram, 3);
  26. // Test linear buckets overflow.
  27. UmaHistogramExactLinear(histogram, 200, 100);
  28. tester.ExpectBucketCount(histogram, 101, 1);
  29. tester.ExpectTotalCount(histogram, 4);
  30. // Test linear buckets underflow.
  31. UmaHistogramExactLinear(histogram, 0, 100);
  32. tester.ExpectBucketCount(histogram, 0, 1);
  33. tester.ExpectTotalCount(histogram, 5);
  34. }
  35. TEST(HistogramFunctionsTest, Enumeration) {
  36. std::string histogram("Testing.UMA.HistogramEnumeration");
  37. HistogramTester tester;
  38. UmaHistogramEnumeration(histogram, UMA_HISTOGRAM_TESTING_ENUM_FIRST,
  39. UMA_HISTOGRAM_TESTING_ENUM_THIRD);
  40. tester.ExpectUniqueSample(histogram, UMA_HISTOGRAM_TESTING_ENUM_FIRST, 1);
  41. // Verify the overflow & underflow bucket exists.
  42. UMA_HISTOGRAM_ENUMERATION(
  43. histogram, static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD) + 10,
  44. static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD));
  45. tester.ExpectBucketCount(
  46. histogram, static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD) + 1, 1);
  47. tester.ExpectTotalCount(histogram, 2);
  48. }
  49. TEST(HistogramFunctionsTest, Boolean) {
  50. std::string histogram("Testing.UMA.HistogramBoolean");
  51. HistogramTester tester;
  52. UmaHistogramBoolean(histogram, true);
  53. tester.ExpectUniqueSample(histogram, 1, 1);
  54. UmaHistogramBoolean(histogram, false);
  55. tester.ExpectBucketCount(histogram, 0, 1);
  56. tester.ExpectTotalCount(histogram, 2);
  57. }
  58. TEST(HistogramFunctionsTest, Percentage) {
  59. std::string histogram("Testing.UMA.HistogramPercentage");
  60. HistogramTester tester;
  61. UmaHistogramPercentage(histogram, 1);
  62. tester.ExpectBucketCount(histogram, 1, 1);
  63. tester.ExpectTotalCount(histogram, 1);
  64. UmaHistogramPercentage(histogram, 50);
  65. tester.ExpectBucketCount(histogram, 50, 1);
  66. tester.ExpectTotalCount(histogram, 2);
  67. UmaHistogramPercentage(histogram, 100);
  68. tester.ExpectBucketCount(histogram, 100, 1);
  69. tester.ExpectTotalCount(histogram, 3);
  70. // Test overflows.
  71. UmaHistogramPercentage(histogram, 101);
  72. tester.ExpectBucketCount(histogram, 101, 1);
  73. tester.ExpectTotalCount(histogram, 4);
  74. UmaHistogramPercentage(histogram, 500);
  75. tester.ExpectBucketCount(histogram, 101, 2);
  76. tester.ExpectTotalCount(histogram, 5);
  77. }
  78. TEST(HistogramFunctionsTest, Counts) {
  79. std::string histogram("Testing.UMA.HistogramCount.Custom");
  80. HistogramTester tester;
  81. // Add a sample that should go into the underflow bucket.
  82. UmaHistogramCustomCounts(histogram, 0, 1, 100, 10);
  83. // Add a sample that should go into the first bucket.
  84. UmaHistogramCustomCounts(histogram, 1, 1, 100, 10);
  85. // Add multiple samples that should go into the same bucket.
  86. UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
  87. UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
  88. UmaHistogramCustomCounts(histogram, 21, 1, 100, 10);
  89. // Add a sample that should go into the last bucket.
  90. UmaHistogramCustomCounts(histogram, 99, 1, 100, 10);
  91. // Add some samples that should go into the overflow bucket.
  92. UmaHistogramCustomCounts(histogram, 100, 1, 100, 10);
  93. UmaHistogramCustomCounts(histogram, 101, 1, 100, 10);
  94. // Verify the number of samples.
  95. tester.ExpectTotalCount(histogram, 8);
  96. // Verify the following:
  97. // (a) The underflow bucket [0, 1) contains one sample.
  98. // (b) The first and last buckets each contain one sample.
  99. // (c) The bucket for values in [16, 29) contains three samples.
  100. // (d) The overflow bucket contains two samples.
  101. EXPECT_THAT(tester.GetAllSamples(histogram),
  102. testing::ElementsAre(Bucket(0, 1), Bucket(1, 1), Bucket(16, 3),
  103. Bucket(54, 1), Bucket(100, 2)));
  104. }
  105. TEST(HistogramFunctionsTest, Times) {
  106. std::string histogram("Testing.UMA.HistogramTimes");
  107. HistogramTester tester;
  108. UmaHistogramTimes(histogram, Seconds(1));
  109. tester.ExpectTimeBucketCount(histogram, Seconds(1), 1);
  110. tester.ExpectTotalCount(histogram, 1);
  111. UmaHistogramTimes(histogram, Seconds(9));
  112. tester.ExpectTimeBucketCount(histogram, Seconds(9), 1);
  113. tester.ExpectTotalCount(histogram, 2);
  114. UmaHistogramTimes(histogram, Seconds(10)); // Overflows
  115. tester.ExpectTimeBucketCount(histogram, Seconds(10), 1);
  116. UmaHistogramTimes(histogram, Seconds(20)); // Overflows.
  117. // Check the value by picking any overflow time.
  118. tester.ExpectTimeBucketCount(histogram, Seconds(11), 2);
  119. tester.ExpectTotalCount(histogram, 4);
  120. }
  121. TEST(HistogramFunctionsTest, Sparse_SupportsLargeRange) {
  122. std::string histogram("Testing.UMA.HistogramSparse");
  123. HistogramTester tester;
  124. UmaHistogramSparse(histogram, 0);
  125. UmaHistogramSparse(histogram, 123456789);
  126. UmaHistogramSparse(histogram, 123456789);
  127. EXPECT_THAT(tester.GetAllSamples(histogram),
  128. testing::ElementsAre(Bucket(0, 1), Bucket(123456789, 2)));
  129. }
  130. TEST(HistogramFunctionsTest, Sparse_SupportsNegativeValues) {
  131. std::string histogram("Testing.UMA.HistogramSparse");
  132. HistogramTester tester;
  133. UmaHistogramSparse(histogram, -1);
  134. tester.ExpectUniqueSample(histogram, -1, 1);
  135. }
  136. } // namespace base.