@@ -134,7 +134,7 @@ impl Aggregation {
134
134
max_scale,
135
135
) ) ) ;
136
136
}
137
- if * max_scale < - EXPO_MIN_SCALE {
137
+ if * max_scale < EXPO_MIN_SCALE {
138
138
return Err ( MetricsError :: Config ( format ! (
139
139
"aggregation: exponential histogram: max scale ({}) is less than -10" ,
140
140
max_scale,
@@ -146,3 +146,89 @@ impl Aggregation {
146
146
}
147
147
}
148
148
}
149
+
150
+ #[ cfg( test) ]
151
+ mod tests {
152
+ use crate :: metrics:: {
153
+ internal:: { EXPO_MAX_SCALE , EXPO_MIN_SCALE } ,
154
+ Aggregation ,
155
+ } ;
156
+ use opentelemetry:: metrics:: { MetricsError , Result } ;
157
+
158
+ #[ test]
159
+ fn validate_aggregation ( ) {
160
+ struct TestCase {
161
+ name : & ' static str ,
162
+ input : Aggregation ,
163
+ check : Box < dyn Fn ( Result < ( ) > ) -> bool > ,
164
+ }
165
+ let ok = Box :: new ( |result : Result < ( ) > | result. is_ok ( ) ) ;
166
+ let config_error = Box :: new ( |result| matches ! ( result, Err ( MetricsError :: Config ( _) ) ) ) ;
167
+
168
+ let test_cases: Vec < TestCase > = vec ! [
169
+ TestCase {
170
+ name: "base2 histogram with maximum max_scale" ,
171
+ input: Aggregation :: Base2ExponentialHistogram {
172
+ max_size: 160 ,
173
+ max_scale: EXPO_MAX_SCALE ,
174
+ record_min_max: true ,
175
+ } ,
176
+ check: ok. clone( ) ,
177
+ } ,
178
+ TestCase {
179
+ name: "base2 histogram with minimum max_scale" ,
180
+ input: Aggregation :: Base2ExponentialHistogram {
181
+ max_size: 160 ,
182
+ max_scale: EXPO_MIN_SCALE ,
183
+ record_min_max: true ,
184
+ } ,
185
+ check: ok. clone( ) ,
186
+ } ,
187
+ TestCase {
188
+ name: "base2 histogram with max_scale too small" ,
189
+ input: Aggregation :: Base2ExponentialHistogram {
190
+ max_size: 160 ,
191
+ max_scale: EXPO_MIN_SCALE - 1 ,
192
+ record_min_max: true ,
193
+ } ,
194
+ check: config_error. clone( ) ,
195
+ } ,
196
+ TestCase {
197
+ name: "base2 histogram with max_scale too big" ,
198
+ input: Aggregation :: Base2ExponentialHistogram {
199
+ max_size: 160 ,
200
+ max_scale: EXPO_MAX_SCALE + 1 ,
201
+ record_min_max: true ,
202
+ } ,
203
+ check: config_error. clone( ) ,
204
+ } ,
205
+ TestCase {
206
+ name: "explicit histogram with one boundary" ,
207
+ input: Aggregation :: ExplicitBucketHistogram {
208
+ boundaries: vec![ 0.0 ] ,
209
+ record_min_max: true ,
210
+ } ,
211
+ check: ok. clone( ) ,
212
+ } ,
213
+ TestCase {
214
+ name: "explicit histogram with monotonic boundaries" ,
215
+ input: Aggregation :: ExplicitBucketHistogram {
216
+ boundaries: vec![ 0.0 , 2.0 , 4.0 , 8.0 ] ,
217
+ record_min_max: true ,
218
+ } ,
219
+ check: ok. clone( ) ,
220
+ } ,
221
+ TestCase {
222
+ name: "explicit histogram with non-monotonic boundaries" ,
223
+ input: Aggregation :: ExplicitBucketHistogram {
224
+ boundaries: vec![ 2.0 , 0.0 , 4.0 , 8.0 ] ,
225
+ record_min_max: true ,
226
+ } ,
227
+ check: config_error. clone( ) ,
228
+ } ,
229
+ ] ;
230
+ for test in test_cases {
231
+ assert ! ( ( test. check) ( test. input. validate( ) ) , "{}" , test. name)
232
+ }
233
+ }
234
+ }
0 commit comments