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