// This file is part of OpenTSDB.
// Copyright (C) 2010-2012 The OpenTSDB Authors.
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 2.1 of the License, or (at your
// option) any later version. This program is distributed in the hope that it
// will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
// General Public License for more details. You should have received a copy
// of the GNU Lesser General Public License along with this program. If not,
// see <http://www.gnu.org/licenses/>.
package net.opentsdb.stats;
import junit.framework.TestCase;
public final class TestHistogram extends TestCase {
public void test_percentile_empty_histogram() {
final Histogram histo = new Histogram(16000, (short) 2, 100);
assertEquals(0, histo.percentile(1));
assertEquals(0, histo.percentile(50));
assertEquals(0, histo.percentile(99));
}
public void test_16Max_1Interval_5Cutoff() {
final Histogram histo = new Histogram(16, (short) 1, 5);
assertEquals(10, histo.buckets());
histo.add(4);
assertBucketEquals(histo, 4, 1);
histo.add(5);
assertBucketEquals(histo, 5, 1);
histo.add(5);
assertBucketEquals(histo, 5, 2);
histo.add(0);
assertBucketEquals(histo, 0, 1);
histo.add(42);
assertBucketEquals(histo, 9, 1);
histo.add(6);
assertBucketEquals(histo, 5, 3);
histo.add(9);
assertBucketEquals(histo, 7, 1);
histo.add(10);
assertBucketEquals(histo, 7, 2);
assertBucketEquals(histo, 0, 1);
assertBucketEquals(histo, 1, 0);
assertBucketEquals(histo, 2, 0);
assertBucketEquals(histo, 3, 0);
assertBucketEquals(histo, 4, 1);
assertBucketEquals(histo, 5, 3);
assertBucketEquals(histo, 6, 0);
assertBucketEquals(histo, 7, 2);
assertBucketEquals(histo, 8, 0);
assertBucketEquals(histo, 9, 1);
}
public void test_16Max_2Interval_5Cutoff() {
final Histogram histo = new Histogram(16, (short) 2, 5);
assertEquals(6, histo.buckets());
histo.add(4);
assertBucketEquals(histo, 2, 1);
histo.add(6);
assertBucketEquals(histo, 2, 2);
histo.add(7);
assertBucketEquals(histo, 2, 3);
histo.add(0);
assertBucketEquals(histo, 0, 1);
histo.add(42);
assertBucketEquals(histo, 5, 1);
histo.add(8);
assertBucketEquals(histo, 3, 1);
histo.add(9);
assertBucketEquals(histo, 3, 2);
histo.add(10);
assertBucketEquals(histo, 3, 3);
histo.add(11);
assertBucketEquals(histo, 3, 4);
histo.add(12);
assertBucketEquals(histo, 5, 1);
assertBucketEquals(histo, 0, 1);
assertBucketEquals(histo, 1, 0);
assertBucketEquals(histo, 2, 3);
assertBucketEquals(histo, 3, 4);
assertBucketEquals(histo, 4, 1);
assertBucketEquals(histo, 5, 1);
}
public void test_160Max_20Interval_50Cutoff() {
final Histogram histo = new Histogram(160, (short) 20, 50);
assertEquals(6, histo.buckets());
histo.add(0);
assertBucketEquals(histo, 0, 1);
histo.add(40);
assertBucketEquals(histo, 2, 1);
histo.add(50);
assertBucketEquals(histo, 2, 2);
histo.add(60);
assertBucketEquals(histo, 2, 3);
histo.add(71);
assertBucketEquals(histo, 2, 4);
histo.add(72);
assertBucketEquals(histo, 3, 1);
histo.add(103);
assertBucketEquals(histo, 3, 2);
histo.add(104);
assertBucketEquals(histo, 4, 1);
histo.add(130);
assertBucketEquals(histo, 4, 2);
histo.add(160);
assertBucketEquals(histo, 4, 3);
histo.add(167);
assertBucketEquals(histo, 4, 4);
histo.add(168);
assertBucketEquals(histo, 5, 1);
histo.add(420);
assertBucketEquals(histo, 5, 2);
assertBucketEquals(histo, 0, 1);
assertBucketEquals(histo, 1, 0);
assertBucketEquals(histo, 2, 4);
assertBucketEquals(histo, 3, 2);
assertBucketEquals(histo, 4, 4);
assertBucketEquals(histo, 5, 2);
}
static void assertBucketEquals(final Histogram histo,
final int bucket, final int expected) {
int actual = histo.valueInBucket(bucket);
if (actual != expected) {
final StringBuilder buf = new StringBuilder();
final int nbuckets = histo.buckets();
for (int i = 0; i < nbuckets; i++) {
histo.printAsciiBucket(buf, i);
if (i == bucket) {
buf.setCharAt(buf.length() - 1, ' ');
buf.append(" <=== should have been ").append(expected).append('\n');
}
}
fail("Bucket #" + bucket + " contains " + actual + " instead of "
+ expected + "\nHistogram:\n" + buf);
}
}
static void printHisto(final Histogram histo) {
final StringBuilder buf = new StringBuilder();
histo.printAscii(buf);
System.err.println(buf);
}
}