|
rpm-build |
2ca94e |
/**
|
|
rpm-build |
2ca94e |
* hdr_histogram_test.c
|
|
rpm-build |
2ca94e |
* Written by Michael Barker and released to the public domain,
|
|
rpm-build |
2ca94e |
* as explained at http://creativecommons.org/publicdomain/zero/1.0/
|
|
rpm-build |
2ca94e |
*/
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
#include <stdint.h>
|
|
rpm-build |
2ca94e |
#include <stdbool.h>
|
|
rpm-build |
2ca94e |
#include <stdlib.h>
|
|
rpm-build |
2ca94e |
#include <errno.h>
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
#include <stdio.h>
|
|
rpm-build |
2ca94e |
#include <hdr_histogram.h>
|
|
rpm-build |
2ca94e |
#include <hdr_interval_recorder.h>
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
#include "minunit.h"
|
|
rpm-build |
2ca94e |
#include "hdr_test_util.h"
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static bool compare_values(double a, double b, double variation)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
return compare_double(a, b, b * variation);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static bool compare_percentile(int64_t a, double b, double variation)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
return compare_values((double) a, b, variation);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
int tests_run = 0;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static struct hdr_histogram* raw_histogram = NULL;
|
|
rpm-build |
2ca94e |
static struct hdr_histogram* cor_histogram = NULL;
|
|
rpm-build |
2ca94e |
static struct hdr_histogram* scaled_raw_histogram = NULL;
|
|
rpm-build |
2ca94e |
static struct hdr_histogram* scaled_cor_histogram = NULL;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static void load_histograms()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
const int64_t highest_trackable_value = INT64_C(3600) * 1000 * 1000;
|
|
rpm-build |
2ca94e |
const int32_t significant_figures = 3;
|
|
rpm-build |
2ca94e |
const int64_t interval = INT64_C(10000);
|
|
rpm-build |
2ca94e |
const int64_t scale = 512;
|
|
rpm-build |
2ca94e |
const int64_t scaled_interval = interval * scale;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
int i;
|
|
rpm-build |
2ca94e |
if (raw_histogram)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
free(raw_histogram);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_init(1, highest_trackable_value, significant_figures, &raw_histogram);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
if (cor_histogram)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
free(cor_histogram);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_init(1, highest_trackable_value, significant_figures, &cor_histogram);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
if (scaled_raw_histogram)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
free(scaled_raw_histogram);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_init(1000, highest_trackable_value * 512, significant_figures, &scaled_raw_histogram);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
if (scaled_cor_histogram)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
free(scaled_cor_histogram);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_init(1000, highest_trackable_value * 512, significant_figures, &scaled_cor_histogram);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
for (i = 0; i < 10000; i++)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(raw_histogram, 1000);
|
|
rpm-build |
2ca94e |
hdr_record_corrected_value_atomic(cor_histogram, 1000, interval);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(scaled_raw_histogram, 1000 * scale);
|
|
rpm-build |
2ca94e |
hdr_record_corrected_value_atomic(scaled_cor_histogram, 1000 * scale, scaled_interval);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(raw_histogram, 100000000);
|
|
rpm-build |
2ca94e |
hdr_record_corrected_value_atomic(cor_histogram, 100000000, 10000L);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(scaled_raw_histogram, 100000000 * scale);
|
|
rpm-build |
2ca94e |
hdr_record_corrected_value_atomic(scaled_cor_histogram, 100000000 * scale, scaled_interval);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_create()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct hdr_histogram* h = NULL;
|
|
rpm-build |
2ca94e |
int r = hdr_init(1, INT64_C(3600000000), 3, &h);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Failed to allocate hdr_histogram", r == 0);
|
|
rpm-build |
2ca94e |
mu_assert("Failed to allocate hdr_histogram", h != NULL);
|
|
rpm-build |
2ca94e |
mu_assert("Incorrect array length", compare_int64(h->counts_len, 23552));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
free(h);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_create_with_large_values()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct hdr_histogram* h = NULL;
|
|
rpm-build |
2ca94e |
int r = hdr_init(20000000, 100000000, 5, &h);
|
|
rpm-build |
2ca94e |
mu_assert("Didn't create", r == 0);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 100000000);
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 20000000);
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 30000000);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert(
|
|
rpm-build |
2ca94e |
"50.0% Percentile",
|
|
rpm-build |
2ca94e |
hdr_values_are_equivalent(h, 20000000, hdr_value_at_percentile(h, 50.0)));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert(
|
|
rpm-build |
2ca94e |
"83.33% Percentile",
|
|
rpm-build |
2ca94e |
hdr_values_are_equivalent(h, 30000000, hdr_value_at_percentile(h, 83.33)));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert(
|
|
rpm-build |
2ca94e |
"83.34% Percentile",
|
|
rpm-build |
2ca94e |
hdr_values_are_equivalent(h, 100000000, hdr_value_at_percentile(h, 83.34)));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert(
|
|
rpm-build |
2ca94e |
"99.0% Percentile",
|
|
rpm-build |
2ca94e |
hdr_values_are_equivalent(h, 100000000, hdr_value_at_percentile(h, 99.0)));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_invalid_significant_figures()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct hdr_histogram* h = NULL;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
int r = hdr_alloc(36000000, -1, &h);
|
|
rpm-build |
2ca94e |
mu_assert("Result was not EINVAL", r == EINVAL);
|
|
rpm-build |
2ca94e |
mu_assert("Histogram was not null", h == 0);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
r = hdr_alloc(36000000, 6, &h);
|
|
rpm-build |
2ca94e |
mu_assert("Result was not EINVAL", r == EINVAL);
|
|
rpm-build |
2ca94e |
mu_assert("Histogram was not null", h == 0);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_invalid_init()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct hdr_histogram* h = NULL;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Should not allow 0 as lowest trackable value", EINVAL == hdr_init(0, 64*1024, 2, &h);;
|
|
rpm-build |
2ca94e |
mu_assert("Should have lowest < 2 * highest", EINVAL == hdr_init(80, 110, 5, &h);;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_total_count()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Total raw count != 10001", raw_histogram->total_count == 10001);
|
|
rpm-build |
2ca94e |
mu_assert("Total corrected count != 20000", cor_histogram->total_count == 20000);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_get_max_value()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
int64_t actual_raw_max, actual_cor_max;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
actual_raw_max = hdr_max(raw_histogram);
|
|
rpm-build |
2ca94e |
mu_assert("hdr_max(raw_histogram) != 100000000L",
|
|
rpm-build |
2ca94e |
hdr_values_are_equivalent(raw_histogram, actual_raw_max, 100000000));
|
|
rpm-build |
2ca94e |
actual_cor_max = hdr_max(cor_histogram);
|
|
rpm-build |
2ca94e |
mu_assert("hdr_max(cor_histogram) != 100000000L",
|
|
rpm-build |
2ca94e |
hdr_values_are_equivalent(cor_histogram, actual_cor_max, 100000000));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_get_min_value()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("hdr_min(raw_histogram) != 1000", hdr_min(raw_histogram) == 1000);
|
|
rpm-build |
2ca94e |
mu_assert("hdr_min(cor_histogram) != 1000", hdr_min(cor_histogram) == 1000);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_percentiles()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Value at 30% not 1000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(raw_histogram, 30.0), 1000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99% not 1000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(raw_histogram, 99.0), 1000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99.99% not 1000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(raw_histogram, 99.99), 1000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99.999% not 100000000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(raw_histogram, 99.999), 100000000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 100% not 100000000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(raw_histogram, 100.0), 100000000.0, 0.001));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Value at 30% not 1000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(cor_histogram, 30.0), 1000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 50% not 1000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(cor_histogram, 50.0), 1000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 75% not 50000000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(cor_histogram, 75.0), 50000000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 90% not 80000000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(cor_histogram, 90.0), 80000000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99% not 98000000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(cor_histogram, 99.0), 98000000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99.999% not 100000000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(cor_histogram, 99.999), 100000000.0, 0.001));
|
|
rpm-build |
2ca94e |
mu_assert("Value at 100% not 100000000.0",
|
|
rpm-build |
2ca94e |
compare_percentile(hdr_value_at_percentile(cor_histogram, 100.0), 100000000.0, 0.001));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_recorded_values()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct hdr_iter iter;
|
|
rpm-build |
2ca94e |
int index;
|
|
rpm-build |
2ca94e |
int64_t total_added_count = 0;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
/* Raw Histogram */
|
|
rpm-build |
2ca94e |
hdr_iter_recorded_init(&iter, raw_histogram);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
index = 0;
|
|
rpm-build |
2ca94e |
while (hdr_iter_next(&iter))
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
int64_t count_added_in_this_bucket = iter.specifics.recorded.count_added_in_this_iteration_step;
|
|
rpm-build |
2ca94e |
if (index == 0)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Value at 0 is not 10000", count_added_in_this_bucket == 10000);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
else
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Value at 1 is not 1", count_added_in_this_bucket == 1);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
index++;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
mu_assert("Should have encountered 2 values", index == 2);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
/* Corrected Histogram */
|
|
rpm-build |
2ca94e |
hdr_iter_recorded_init(&iter, cor_histogram);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
index = 0;
|
|
rpm-build |
2ca94e |
while (hdr_iter_next(&iter))
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
int64_t count_added_in_this_bucket = iter.specifics.recorded.count_added_in_this_iteration_step;
|
|
rpm-build |
2ca94e |
if (index == 0)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Count at 0 is not 10000", count_added_in_this_bucket == 10000);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
mu_assert("Count should not be 0", iter.count != 0);
|
|
rpm-build |
2ca94e |
mu_assert("Count at value iterated to should be count added in this step",
|
|
rpm-build |
2ca94e |
iter.count == count_added_in_this_bucket);
|
|
rpm-build |
2ca94e |
total_added_count += count_added_in_this_bucket;
|
|
rpm-build |
2ca94e |
index++;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
mu_assert("Total counts should be 20000", total_added_count == 20000);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_linear_values()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct hdr_iter iter;
|
|
rpm-build |
2ca94e |
int index;
|
|
rpm-build |
2ca94e |
int64_t total_added_count;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
/* Raw Histogram */
|
|
rpm-build |
2ca94e |
hdr_iter_linear_init(&iter, raw_histogram, 100000);
|
|
rpm-build |
2ca94e |
index = 0;
|
|
rpm-build |
2ca94e |
while (hdr_iter_next(&iter))
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
int64_t count_added_in_this_bucket = iter.specifics.linear.count_added_in_this_iteration_step;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
if (index == 0)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Count at 0 is not 10000", count_added_in_this_bucket == 10000);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
else if (index == 999)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Count at 999 is not 1", count_added_in_this_bucket == 1);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
else
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Count should be 0", count_added_in_this_bucket == 0);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
index++;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
mu_assert("Should of met 1000 values", compare_int64(index, 1000));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
/* Corrected Histogram */
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_iter_linear_init(&iter, cor_histogram, 10000);
|
|
rpm-build |
2ca94e |
index = 0;
|
|
rpm-build |
2ca94e |
total_added_count = 0;
|
|
rpm-build |
2ca94e |
while (hdr_iter_next(&iter))
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
int64_t count_added_in_this_bucket = iter.specifics.linear.count_added_in_this_iteration_step;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
if (index == 0)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Count at 0 is not 10001", count_added_in_this_bucket == 10001);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
total_added_count += count_added_in_this_bucket;
|
|
rpm-build |
2ca94e |
index++;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
mu_assert("Should of met 10001 values", index == 10000);
|
|
rpm-build |
2ca94e |
mu_assert("Should of met 20000 counts", total_added_count == 20000);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_logarithmic_values()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct hdr_iter iter;
|
|
rpm-build |
2ca94e |
int index;
|
|
rpm-build |
2ca94e |
uint64_t total_added_count;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_iter_log_init(&iter, raw_histogram, 10000, 2.0);
|
|
rpm-build |
2ca94e |
index = 0;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
while(hdr_iter_next(&iter))
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
uint64_t count_added_in_this_bucket = iter.specifics.log.count_added_in_this_iteration_step;
|
|
rpm-build |
2ca94e |
if (index == 0)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Raw Logarithmic 10 msec bucket # 0 added a count of 10000", 10000 == count_added_in_this_bucket);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
else if (index == 14)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Raw Logarithmic 10 msec bucket # 14 added a count of 1", 1 == count_added_in_this_bucket);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
else
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Raw Logarithmic 10 msec bucket added a count of 0", 0 == count_added_in_this_bucket);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
index++;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Should of seen 14 values", index - 1 == 14);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_iter_log_init(&iter, cor_histogram, 10000, 2.0);
|
|
rpm-build |
2ca94e |
index = 0;
|
|
rpm-build |
2ca94e |
total_added_count = 0;
|
|
rpm-build |
2ca94e |
while (hdr_iter_next(&iter))
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
uint64_t count_added_in_this_bucket = iter.specifics.log.count_added_in_this_iteration_step;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
if (index == 0)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_assert("Corrected Logarithmic 10 msec bucket # 0 added a count of 10001", 10001 == count_added_in_this_bucket);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
total_added_count += count_added_in_this_bucket;
|
|
rpm-build |
2ca94e |
index++;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Should of seen 14 values", index - 1 == 14);
|
|
rpm-build |
2ca94e |
mu_assert("Should of seen count of 20000", total_added_count == 20000);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_reset()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99% == 0.0", hdr_value_at_percentile(raw_histogram, 99.0) != 0);
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99% == 0.0", hdr_value_at_percentile(cor_histogram, 99.0) != 0);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_reset(raw_histogram);
|
|
rpm-build |
2ca94e |
hdr_reset(cor_histogram);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Total raw count != 0", raw_histogram->total_count == 0);
|
|
rpm-build |
2ca94e |
mu_assert("Total corrected count != 0", cor_histogram->total_count == 0);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99% not 0.0", hdr_value_at_percentile(raw_histogram, 99.0) == 0);
|
|
rpm-build |
2ca94e |
mu_assert("Value at 99% not 0.0", hdr_value_at_percentile(cor_histogram, 99.0) == 0);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_scaling_equivalence()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
int64_t expected_99th, scaled_99th;
|
|
rpm-build |
2ca94e |
load_histograms();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert(
|
|
rpm-build |
2ca94e |
"Averages should be equivalent",
|
|
rpm-build |
2ca94e |
compare_values(
|
|
rpm-build |
2ca94e |
hdr_mean(cor_histogram) * 512,
|
|
rpm-build |
2ca94e |
hdr_mean(scaled_cor_histogram),
|
|
rpm-build |
2ca94e |
0.000001));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert(
|
|
rpm-build |
2ca94e |
"Total count should be equivalent",
|
|
rpm-build |
2ca94e |
compare_int64(
|
|
rpm-build |
2ca94e |
cor_histogram->total_count,
|
|
rpm-build |
2ca94e |
scaled_cor_histogram->total_count));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
expected_99th = hdr_value_at_percentile(cor_histogram, 99.0) * 512;
|
|
rpm-build |
2ca94e |
scaled_99th = hdr_value_at_percentile(scaled_cor_histogram, 99.0);
|
|
rpm-build |
2ca94e |
mu_assert(
|
|
rpm-build |
2ca94e |
"99%'iles should be equivalent",
|
|
rpm-build |
2ca94e |
compare_int64(
|
|
rpm-build |
2ca94e |
hdr_lowest_equivalent_value(cor_histogram, expected_99th),
|
|
rpm-build |
2ca94e |
hdr_lowest_equivalent_value(scaled_cor_histogram, scaled_99th)));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_out_of_range_values()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct hdr_histogram *h;
|
|
rpm-build |
2ca94e |
hdr_init(1, 1000, 4, &h);
|
|
rpm-build |
2ca94e |
mu_assert("Should successfully record value", hdr_record_value_atomic(h, 32767));
|
|
rpm-build |
2ca94e |
mu_assert("Should not record value", !hdr_record_value_atomic(h, 32768));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_linear_iter_buckets_correctly()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
int step_count = 0;
|
|
rpm-build |
2ca94e |
int64_t total_count = 0;
|
|
rpm-build |
2ca94e |
struct hdr_histogram *h;
|
|
rpm-build |
2ca94e |
struct hdr_iter iter;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_init(1, 255, 2, &h);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 193);
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 255);
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 0);
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 1);
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 64);
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 128);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
hdr_iter_linear_init(&iter, h, 64);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
while (hdr_iter_next(&iter))
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
total_count += iter.specifics.linear.count_added_in_this_iteration_step;
|
|
rpm-build |
2ca94e |
/* start - changes to reproduce issue */
|
|
rpm-build |
2ca94e |
if (step_count == 0)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
hdr_record_value_atomic(h, 2);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
/* end - changes to reproduce issue */
|
|
rpm-build |
2ca94e |
step_count++;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_assert("Number of steps", compare_int64(4, step_count));
|
|
rpm-build |
2ca94e |
mu_assert("Total count", compare_int64(6, total_count));
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static char* test_interval_recording()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
int value_count, i, value;
|
|
rpm-build |
2ca94e |
char* result;
|
|
rpm-build |
2ca94e |
struct hdr_histogram* expected_histogram;
|
|
rpm-build |
2ca94e |
struct hdr_histogram* expected_corrected_histogram;
|
|
rpm-build |
2ca94e |
struct hdr_interval_recorder recorder;
|
|
rpm-build |
2ca94e |
struct hdr_interval_recorder recorder_corrected;
|
|
rpm-build |
2ca94e |
struct hdr_histogram* recorder_histogram;
|
|
rpm-build |
2ca94e |
struct hdr_histogram* recorder_corrected_histogram;
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
value_count = 1000000;
|
|
rpm-build |
2ca94e |
hdr_interval_recorder_init_all(&recorder, 1, INT64_C(24) * 60 * 60 * 1000000, 3);
|
|
rpm-build |
2ca94e |
hdr_interval_recorder_init_all(&recorder_corrected, 1, INT64_C(24) * 60 * 60 * 1000000, 3);
|
|
rpm-build |
2ca94e |
hdr_init(1, INT64_C(24) * 60 * 60 * 1000000, 3, &expected_histogram);
|
|
rpm-build |
2ca94e |
hdr_init(1, INT64_C(24) * 60 * 60 * 1000000, 3, &expected_corrected_histogram);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
for (i = 0; i < value_count; i++)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
value = rand() % 20000;
|
|
rpm-build |
2ca94e |
hdr_record_value(expected_histogram, value);
|
|
rpm-build |
2ca94e |
hdr_record_corrected_value(expected_corrected_histogram, value, 1000);
|
|
rpm-build |
2ca94e |
hdr_interval_recorder_record_value_atomic(&recorder, value);
|
|
rpm-build |
2ca94e |
hdr_interval_recorder_record_corrected_value_atomic(&recorder_corrected, value, 1000);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
recorder_histogram = hdr_interval_recorder_sample(&recorder);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
result = compare_histograms(expected_histogram, recorder_histogram);
|
|
rpm-build |
2ca94e |
if (result)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
return result;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
recorder_corrected_histogram = hdr_interval_recorder_sample(&recorder_corrected);
|
|
rpm-build |
2ca94e |
result = compare_histograms(expected_corrected_histogram, recorder_corrected_histogram);
|
|
rpm-build |
2ca94e |
if (result)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
return result;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return 0;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static struct mu_result all_tests()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
mu_run_test(test_create);
|
|
rpm-build |
2ca94e |
mu_run_test(test_invalid_init);
|
|
rpm-build |
2ca94e |
mu_run_test(test_create_with_large_values);
|
|
rpm-build |
2ca94e |
mu_run_test(test_invalid_significant_figures);
|
|
rpm-build |
2ca94e |
mu_run_test(test_total_count);
|
|
rpm-build |
2ca94e |
mu_run_test(test_get_min_value);
|
|
rpm-build |
2ca94e |
mu_run_test(test_get_max_value);
|
|
rpm-build |
2ca94e |
mu_run_test(test_percentiles);
|
|
rpm-build |
2ca94e |
mu_run_test(test_recorded_values);
|
|
rpm-build |
2ca94e |
mu_run_test(test_linear_values);
|
|
rpm-build |
2ca94e |
mu_run_test(test_logarithmic_values);
|
|
rpm-build |
2ca94e |
mu_run_test(test_reset);
|
|
rpm-build |
2ca94e |
mu_run_test(test_scaling_equivalence);
|
|
rpm-build |
2ca94e |
mu_run_test(test_out_of_range_values);
|
|
rpm-build |
2ca94e |
mu_run_test(test_linear_iter_buckets_correctly);
|
|
rpm-build |
2ca94e |
mu_run_test(test_interval_recording);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
mu_ok;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
static int hdr_histogram_run_tests()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
struct mu_result result = all_tests();
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
if (result.message != 0)
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
printf("hdr_histogram_test.%s(): %s\n", result.test, result.message);
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
else
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
printf("ALL TESTS PASSED\n");
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
printf("Tests run: %d\n", tests_run);
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
return result.message == NULL ? 0 : -1;
|
|
rpm-build |
2ca94e |
}
|
|
rpm-build |
2ca94e |
|
|
rpm-build |
2ca94e |
int main()
|
|
rpm-build |
2ca94e |
{
|
|
rpm-build |
2ca94e |
return hdr_histogram_run_tests();
|
|
rpm-build |
2ca94e |
}
|