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