15b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen/*
25b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * Copyright (C) 2018 The Android Open Source Project
35b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen *
45b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * Licensed under the Apache License, Version 2.0 (the "License");
55b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * you may not use this file except in compliance with the License.
65b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * You may obtain a copy of the License at
75b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen *
85b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen *      http://www.apache.org/licenses/LICENSE-2.0
95b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen *
105b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * Unless required by applicable law or agreed to in writing, software
115b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * distributed under the License is distributed on an "AS IS" BASIS,
125b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * See the License for the specific language governing permissions and
145b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * limitations under the License.
155b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen */
165b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
175b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenpackage com.android.server.wifi.util;
185b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
195b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenimport static org.hamcrest.core.IsEqual.equalTo;
205b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
215b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenimport android.util.SparseIntArray;
225b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
235b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenimport org.junit.Before;
245b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenimport org.junit.Rule;
255b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenimport org.junit.Test;
265b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenimport org.junit.rules.ErrorCollector;
275b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenimport org.mockito.MockitoAnnotations;
285b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
295b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen/**
305b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen * Unit test harness for MetricsUtils.
315b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen */
325b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohenpublic class MetricsUtilsTest {
335b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    @Rule
345b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    public ErrorCollector collector = new ErrorCollector();
355b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
365b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    /**
375b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * Pre-test configuration. Initialize and install mocks.
385b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     */
395b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    @Before
405b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    public void setUp() throws Exception {
415b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        MockitoAnnotations.initMocks(this);
425b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    }
435b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
445b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    /**
455b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * Histogram of following buckets, start[i] = 0 + 1 * 10^i with 9 sub-buckets, i=0,...,5
465b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * 1 - 10: 9 sub-buckets each of width 1
475b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * 10 - 100: 10
485b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * 100 - 10e3: 10^2
495b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * 10e3 - 10e4: 10^3
505b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * 10e4 - 10e5: 10^4
515b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * 10e5 - 10e6: 10^5
525b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     */
535b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    private static final MetricsUtils.LogHistParms HIST1 = new MetricsUtils.LogHistParms(0, 1, 10,
545b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen            9, 6);
555b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
565b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    /**
575b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * Histogram of following buckets, start[i] = -20 + 2 * 5^i with 40 sub-buckets, i=0,...,2
585b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * -18 - -10: 40 sub-bucket each of width 0.2
595b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * -10 - 30: 1
605b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * 30 - 230: 5
615b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     */
625b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    private static final MetricsUtils.LogHistParms HIST2 = new MetricsUtils.LogHistParms(-20, 2, 5,
635b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen            40, 3);
645b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
655b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    // Linear histogram of following buckets:
665b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    //   <10
675b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    //   [10, 30)
685b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    //   [30, 60)
695b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    //   [60, 100)
705b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    //   >100
715b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    private static final int[] HIST_LINEAR = {10, 30, 60, 100};
725b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
735b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    /**
745b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * Validate that a set of values are bucketed correctly into the histogram, and that they are
755b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * converted to a primitive proto-buffer array correctly.
765b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     */
775b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    @Test
785b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    public void testHistBucketing() {
795b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        SparseIntArray hist1 = new SparseIntArray();
805b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        SparseIntArray hist2 = new SparseIntArray();
815b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
825b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", -5, hist1, HIST1, 0, 1);
835b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 0, hist1, HIST1, 0, 2);
845b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 1, hist1, HIST1, 0, 3);
855b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 9, hist1, HIST1, 8, 1);
865b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 10, hist1, HIST1, 9, 1);
875b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 99, hist1, HIST1, 17, 1);
885b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 100, hist1, HIST1, 18, 1);
895b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 989, hist1, HIST1, 26, 1);
905b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 990, hist1, HIST1, 26, 2);
915b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 999, hist1, HIST1, 26, 3);
925b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 1000, hist1, HIST1, 27, 1);
935b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 9899, hist1, HIST1, 35, 1);
945b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 9900, hist1, HIST1, 35, 2);
955b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 9999, hist1, HIST1, 35, 3);
965b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 10000, hist1, HIST1, 36, 1);
975b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 98999, hist1, HIST1, 44, 1);
985b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 99000, hist1, HIST1, 44, 2);
995b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 99999, hist1, HIST1, 44, 3);
1005b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 100000, hist1, HIST1, 45, 1);
1015b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 989999, hist1, HIST1, 53, 1);
1025b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 990000, hist1, HIST1, 53, 2);
1035b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 999999, hist1, HIST1, 53, 3);
1045b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 1000000, hist1, HIST1, 53, 4);
1055b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 1000001, hist1, HIST1, 53, 5);
1065b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 5000000, hist1, HIST1, 53, 6);
1075b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST1: x=", 10000000, hist1, HIST1, 53, 7);
1085b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1095b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        MetricsUtils.GenericBucket[] phb1 = MetricsUtils.logHistogramToGenericBuckets(hist1, HIST1);
1105b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        collector.checkThat("Number of buckets #1", phb1.length, equalTo(hist1.size()));
1115b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[0]", phb1[0], 1, 2, 3);
1125b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[1]", phb1[1], 9, 10, 1);
1135b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[2]", phb1[2], 10, 20, 1);
1145b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[3]", phb1[3], 90, 100, 1);
1155b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[4]", phb1[4], 100, 200, 1);
1165b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[5]", phb1[5], 900, 1000, 3);
1175b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[6]", phb1[6], 1000, 2000, 1);
1185b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[7]", phb1[7], 9000, 10000, 3);
1195b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[8]", phb1[8], 10000, 20000, 1);
1205b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[9]", phb1[9], 90000, 100000, 3);
1215b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[10]", phb1[10], 100000, 200000, 1);
1225b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket1[11]", phb1[11], 900000, 1000000, 7);
1235b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1245b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", -20, hist2, HIST2, 0, 1);
1255b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", -18, hist2, HIST2, 0, 2);
1265b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", -17, hist2, HIST2, 5, 1);
1275b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", -11, hist2, HIST2, 35, 1);
1285b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", -10, hist2, HIST2, 40, 1);
1295b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", 29, hist2, HIST2, 79, 1);
1305b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", 30, hist2, HIST2, 80, 1);
1315b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", 229, hist2, HIST2, 119, 1);
1325b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", 230, hist2, HIST2, 119, 2);
1335b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", 300, hist2, HIST2, 119, 3);
1345b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST2: x=", 1000000, hist2, HIST2, 119, 4);
1355b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1365b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        MetricsUtils.GenericBucket[] phb2 = MetricsUtils.logHistogramToGenericBuckets(hist2, HIST2);
1375b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        collector.checkThat("Number of buckets #2", phb2.length, equalTo(hist2.size()));
1385b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket2[0]", phb2[0], -18, -17, 2);
1395b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket2[1]", phb2[1], -17, -16, 1);
1405b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket2[2]", phb2[2], -11, -10, 1);
1415b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket2[3]", phb2[3], -10, -9, 1);
1425b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket2[4]", phb2[4], 29, 30, 1);
1435b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket2[5]", phb2[5], 30, 35, 1);
1445b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket2[6]", phb2[6], 225, 230, 4);
1455b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    }
1465b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1475b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    /**
1485b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * Validate that a set of values are bucketed correctly into the linear histogram, and that
1495b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     * they are converted to a primitive proto-buffer array correctly.
1505b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen     */
1515b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    @Test
1525b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    public void testLinearHistBucketing() {
1535b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        SparseIntArray hist = new SparseIntArray();
1545b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1555b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", -5, hist, HIST_LINEAR, 0, 1);
1565b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 0, hist, HIST_LINEAR, 0, 2);
1575b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 1, hist, HIST_LINEAR, 0, 3);
1585b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 9, hist, HIST_LINEAR, 0, 4);
1595b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 10, hist, HIST_LINEAR, 1, 1);
1605b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 20, hist, HIST_LINEAR, 1, 2);
1615b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 30, hist, HIST_LINEAR, 2, 1);
1625b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 40, hist, HIST_LINEAR, 2, 2);
1635b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 50, hist, HIST_LINEAR, 2, 3);
1645b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 60, hist, HIST_LINEAR, 3, 1);
1655b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 70, hist, HIST_LINEAR, 3, 2);
1665b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 80, hist, HIST_LINEAR, 3, 3);
1675b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 90, hist, HIST_LINEAR, 3, 4);
1685b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 100, hist, HIST_LINEAR, 4, 1);
1695b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 110, hist, HIST_LINEAR, 4, 2);
1705b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        bucketValueAndVerify("HIST_LINEAR: x=", 98999, hist, HIST_LINEAR, 4, 3);
1715b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1725b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        MetricsUtils.GenericBucket[] phb = MetricsUtils.linearHistogramToGenericBuckets(hist,
1735b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen                HIST_LINEAR);
1745b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        collector.checkThat("Number of buckets", phb.length, equalTo(hist.size()));
1755b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket[0]", phb[0], Integer.MIN_VALUE, 10, 4);
1765b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket[1]", phb[1], 10, 30, 2);
1775b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket[2]", phb[2], 30, 60, 3);
1785b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket[3]", phb[3], 60, 100, 4);
1795b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        validateProtoHistBucket("Bucket[4]", phb[4], 100, Integer.MAX_VALUE, 3);
1805b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    }
1815b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1825b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    // utilities
1835b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1845b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    private void bucketValueAndVerify(String prefix, long value, SparseIntArray h,
1855b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen            MetricsUtils.LogHistParms hp, int expectedKey, int expectedValue) {
1865b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        MetricsUtils.addValueToLogHistogram(value, h, hp);
1875b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        collector.checkThat(prefix + value, h.get(expectedKey), equalTo(expectedValue));
1885b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    }
1895b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1905b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    private void bucketValueAndVerify(String prefix, int value, SparseIntArray h, int[] hp,
1915b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen            int expectedKey, int expectedValue) {
1925b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        MetricsUtils.addValueToLinearHistogram(value, h, hp);
1935b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        collector.checkThat(prefix + value, h.get(expectedKey), equalTo(expectedValue));
1945b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    }
1955b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen
1965b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    private void validateProtoHistBucket(String prefix, MetricsUtils.GenericBucket bucket,
1975b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen            long start, long end, int count) {
1985b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        collector.checkThat(prefix + ": start", bucket.start, equalTo(start));
1995b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        collector.checkThat(prefix + ": end", bucket.end, equalTo(end));
2005b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen        collector.checkThat(prefix + ": count", bucket.count, equalTo(count));
2015b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen    }
2025b09fc76e4a2e05c5e5a24e96ff29be2fd49ed9fEtan Cohen}
203