1 //
2 // Copyright (C) 2023 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "Histogram.h"
18 
19 #include <gtest/gtest.h>
20 
21 namespace android {
22 namespace expresslog {
23 
24 #ifdef __ANDROID__
TEST(UniformOptions,getBinsCount)25 TEST(UniformOptions, getBinsCount) {
26     const std::shared_ptr<Histogram::UniformOptions> options1(
27             Histogram::UniformOptions::create(1, 100, 1000));
28     ASSERT_EQ(3, options1->getBinsCount());
29 
30     const std::shared_ptr<Histogram::UniformOptions> options10(
31             Histogram::UniformOptions::create(10, 100, 1000));
32     ASSERT_EQ(12, options10->getBinsCount());
33 }
34 
TEST(UniformOptions,constructZeroBinsCount)35 TEST(UniformOptions, constructZeroBinsCount) {
36     const std::shared_ptr<Histogram::UniformOptions> options(
37             Histogram::UniformOptions::create(0, 100, 1000));
38     ASSERT_EQ(nullptr, options);
39 }
40 
TEST(UniformOptions,constructNegativeBinsCount)41 TEST(UniformOptions, constructNegativeBinsCount) {
42     const std::shared_ptr<Histogram::UniformOptions> options(
43             Histogram::UniformOptions::create(-1, 100, 1000));
44     ASSERT_EQ(nullptr, options);
45 }
46 
TEST(UniformOptions,constructMaxValueLessThanMinValue)47 TEST(UniformOptions, constructMaxValueLessThanMinValue) {
48     const std::shared_ptr<Histogram::UniformOptions> options(
49             Histogram::UniformOptions::create(10, 1000, 100));
50     ASSERT_EQ(nullptr, options);
51 }
52 
TEST(UniformOptions,testBinIndexForRangeEqual1)53 TEST(UniformOptions, testBinIndexForRangeEqual1) {
54     const std::shared_ptr<Histogram::UniformOptions> options(
55             Histogram::UniformOptions::create(10, 1, 11));
56     for (int i = 0, bins = options->getBinsCount(); i < bins; i++) {
57         ASSERT_EQ(i, options->getBinForSample(i));
58     }
59 }
60 
TEST(UniformOptions,testBinIndexForRangeEqual2)61 TEST(UniformOptions, testBinIndexForRangeEqual2) {
62     const std::shared_ptr<Histogram::UniformOptions> options(
63             Histogram::UniformOptions::create(10, 1, 21));
64     for (int i = 0, bins = options->getBinsCount(); i < bins; i++) {
65         ASSERT_EQ(i, options->getBinForSample(i * 2));
66         ASSERT_EQ(i, options->getBinForSample(i * 2 - 1));
67     }
68 }
69 
TEST(UniformOptions,testBinIndexForRangeEqual5)70 TEST(UniformOptions, testBinIndexForRangeEqual5) {
71     const std::shared_ptr<Histogram::UniformOptions> options(
72             Histogram::UniformOptions::create(2, 0, 10));
73     ASSERT_EQ(4, options->getBinsCount());
74     for (int i = 0; i < 2; i++) {
75         for (int sample = 0; sample < 5; sample++) {
76             ASSERT_EQ(i + 1, options->getBinForSample(i * 5 + sample));
77         }
78     }
79 }
80 
TEST(UniformOptions,testBinIndexForRangeEqual10)81 TEST(UniformOptions, testBinIndexForRangeEqual10) {
82     const std::shared_ptr<Histogram::UniformOptions> options(
83             Histogram::UniformOptions::create(10, 1, 101));
84     ASSERT_EQ(0, options->getBinForSample(0));
85     ASSERT_EQ(options->getBinsCount() - 2, options->getBinForSample(100));
86     ASSERT_EQ(options->getBinsCount() - 1, options->getBinForSample(101));
87 
88     const float binSize = (101 - 1) / 10.f;
89     for (int i = 1, bins = options->getBinsCount() - 1; i < bins; i++) {
90         ASSERT_EQ(i, options->getBinForSample(i * binSize));
91     }
92 }
93 
TEST(UniformOptions,testBinIndexForRangeEqual90)94 TEST(UniformOptions, testBinIndexForRangeEqual90) {
95     const int binCount = 10;
96     const int minValue = 100;
97     const int maxValue = 100000;
98 
99     const std::shared_ptr<Histogram::UniformOptions> options(
100             Histogram::UniformOptions::create(binCount, minValue, maxValue));
101 
102     // logging underflow sample
103     ASSERT_EQ(0, options->getBinForSample(minValue - 1));
104 
105     // logging overflow sample
106     ASSERT_EQ(binCount + 1, options->getBinForSample(maxValue));
107     ASSERT_EQ(binCount + 1, options->getBinForSample(maxValue + 1));
108 
109     // logging min edge sample
110     ASSERT_EQ(1, options->getBinForSample(minValue));
111 
112     // logging max edge sample
113     ASSERT_EQ(binCount, options->getBinForSample(maxValue - 1));
114 
115     // logging single valid sample per bin
116     const int binSize = (maxValue - minValue) / binCount;
117 
118     for (int i = 0; i < binCount; i++) {
119         ASSERT_EQ(i + 1, options->getBinForSample(minValue + binSize * i));
120     }
121 }
122 
123 #else
124 GTEST_LOG_(INFO) << "This test does nothing.\n";
125 #endif
126 
127 }  // namespace expresslog
128 }  // namespace android
129