Blame test/hdr_histogram_atomic_test.c

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
}