X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Futils_latency_test.c;h=42a6e87ec79eab12c9fdc42148695f1a51a14d1e;hp=fe871710bb6b2683e85b5826bbde0810c5d5d112;hb=77ca1a45bab2f6adf9301723d0db68e5813a6d98;hpb=8c61dbce195987d352034663204d5df32776e9cb diff --git a/src/utils_latency_test.c b/src/utils_latency_test.c index fe871710..42a6e87e 100644 --- a/src/utils_latency_test.c +++ b/src/utils_latency_test.c @@ -26,15 +26,14 @@ #define DBL_PRECISION 1e-6 -#include "common.h" /* for STATIC_ARRAY_SIZE */ #include "collectd.h" +#include "common.h" /* for STATIC_ARRAY_SIZE */ #include "testing.h" -#include "utils_time.h" #include "utils_latency.h" +#include "utils_time.h" -DEF_TEST(simple) -{ +DEF_TEST(simple) { struct { double val; double min; @@ -42,61 +41,67 @@ DEF_TEST(simple) double sum; double avg; } cases[] = { - /* val min max sum avg */ - {0.5, 0.5, 0.5, 0.5, 0.5}, - {0.3, 0.3, 0.5, 0.8, 0.4}, - {0.7, 0.3, 0.7, 1.5, 0.5}, - {2.5, 0.3, 2.5, 4.0, 1.0}, - { 99, 0.3, 99, 103, 20.6}, - /* { -1, 0.3, 99, 103, 20.6}, see issue #1139 */ + /* val min max sum avg */ + {0.5, 0.5, 0.5, 0.5, 0.5}, {0.3, 0.3, 0.5, 0.8, 0.4}, + {0.7, 0.3, 0.7, 1.5, 0.5}, {2.5, 0.3, 2.5, 4.0, 1.0}, + {99, 0.3, 99, 103, 20.6}, + /* { -1, 0.3, 99, 103, 20.6}, see issue #1139 */ }; latency_counter_t *l; - CHECK_NOT_NULL (l = latency_counter_create ()); - - for (size_t i = 0; i < STATIC_ARRAY_SIZE (cases); i++) { - printf ("# case %zu: DOUBLE_TO_CDTIME_T(%g) = %"PRIu64"\n", - i, cases[i].val, DOUBLE_TO_CDTIME_T (cases[i].val)); - latency_counter_add (l, DOUBLE_TO_CDTIME_T (cases[i].val)); + CHECK_NOT_NULL(l = latency_counter_create()); - EXPECT_EQ_DOUBLE (cases[i].min, CDTIME_T_TO_DOUBLE (latency_counter_get_min (l))); - EXPECT_EQ_DOUBLE (cases[i].max, CDTIME_T_TO_DOUBLE (latency_counter_get_max (l))); - EXPECT_EQ_DOUBLE (cases[i].sum, CDTIME_T_TO_DOUBLE (latency_counter_get_sum (l))); - EXPECT_EQ_DOUBLE (cases[i].avg, CDTIME_T_TO_DOUBLE (latency_counter_get_average (l))); + for (size_t i = 0; i < STATIC_ARRAY_SIZE(cases); i++) { + printf("# case %" PRIsz ": DOUBLE_TO_CDTIME_T(%g) = %" PRIu64 "\n", i, + cases[i].val, DOUBLE_TO_CDTIME_T(cases[i].val)); + latency_counter_add(l, DOUBLE_TO_CDTIME_T(cases[i].val)); + + EXPECT_EQ_DOUBLE(cases[i].min, + CDTIME_T_TO_DOUBLE(latency_counter_get_min(l))); + EXPECT_EQ_DOUBLE(cases[i].max, + CDTIME_T_TO_DOUBLE(latency_counter_get_max(l))); + EXPECT_EQ_DOUBLE(cases[i].sum, + CDTIME_T_TO_DOUBLE(latency_counter_get_sum(l))); + EXPECT_EQ_DOUBLE(cases[i].avg, + CDTIME_T_TO_DOUBLE(latency_counter_get_average(l))); } - latency_counter_destroy (l); + latency_counter_destroy(l); return 0; } -DEF_TEST(percentile) -{ +DEF_TEST(percentile) { latency_counter_t *l; - CHECK_NOT_NULL (l = latency_counter_create ()); + CHECK_NOT_NULL(l = latency_counter_create()); for (size_t i = 0; i < 100; i++) { - latency_counter_add (l, TIME_T_TO_CDTIME_T (((time_t) i) + 1)); + latency_counter_add(l, TIME_T_TO_CDTIME_T(((time_t)i) + 1)); } - EXPECT_EQ_DOUBLE ( 1.0, CDTIME_T_TO_DOUBLE (latency_counter_get_min (l))); - EXPECT_EQ_DOUBLE (100.0, CDTIME_T_TO_DOUBLE (latency_counter_get_max (l))); - EXPECT_EQ_DOUBLE (100.0 * 101.0 / 2.0, CDTIME_T_TO_DOUBLE (latency_counter_get_sum (l))); - EXPECT_EQ_DOUBLE ( 50.5, CDTIME_T_TO_DOUBLE (latency_counter_get_average (l))); - - EXPECT_EQ_DOUBLE (50.0, CDTIME_T_TO_DOUBLE (latency_counter_get_percentile (l, 50.0))); - EXPECT_EQ_DOUBLE (80.0, CDTIME_T_TO_DOUBLE (latency_counter_get_percentile (l, 80.0))); - EXPECT_EQ_DOUBLE (95.0, CDTIME_T_TO_DOUBLE (latency_counter_get_percentile (l, 95.0))); - EXPECT_EQ_DOUBLE (99.0, CDTIME_T_TO_DOUBLE (latency_counter_get_percentile (l, 99.0))); - - CHECK_ZERO (latency_counter_get_percentile (l, -1.0)); - CHECK_ZERO (latency_counter_get_percentile (l, 101.0)); - - latency_counter_destroy (l); + EXPECT_EQ_DOUBLE(1.0, CDTIME_T_TO_DOUBLE(latency_counter_get_min(l))); + EXPECT_EQ_DOUBLE(100.0, CDTIME_T_TO_DOUBLE(latency_counter_get_max(l))); + EXPECT_EQ_DOUBLE(100.0 * 101.0 / 2.0, + CDTIME_T_TO_DOUBLE(latency_counter_get_sum(l))); + EXPECT_EQ_DOUBLE(50.5, CDTIME_T_TO_DOUBLE(latency_counter_get_average(l))); + + EXPECT_EQ_DOUBLE(50.0, + CDTIME_T_TO_DOUBLE(latency_counter_get_percentile(l, 50.0))); + EXPECT_EQ_DOUBLE(80.0, + CDTIME_T_TO_DOUBLE(latency_counter_get_percentile(l, 80.0))); + EXPECT_EQ_DOUBLE(95.0, + CDTIME_T_TO_DOUBLE(latency_counter_get_percentile(l, 95.0))); + EXPECT_EQ_DOUBLE(99.0, + CDTIME_T_TO_DOUBLE(latency_counter_get_percentile(l, 99.0))); + + CHECK_ZERO(latency_counter_get_percentile(l, -1.0)); + CHECK_ZERO(latency_counter_get_percentile(l, 101.0)); + + latency_counter_destroy(l); return 0; } -DEF_TEST (get_rate) { +DEF_TEST(get_rate) { /* We re-declare the struct here so we can inspect its content. */ struct { cdtime_t start_time; @@ -106,40 +111,40 @@ DEF_TEST (get_rate) { cdtime_t max; cdtime_t bin_width; int histogram[HISTOGRAM_NUM_BINS]; - } *peek; + } * peek; latency_counter_t *l; - CHECK_NOT_NULL (l = latency_counter_create ()); - peek = (void *) l; + CHECK_NOT_NULL(l = latency_counter_create()); + peek = (void *)l; for (time_t i = 1; i <= 125; i++) { - latency_counter_add (l, TIME_T_TO_CDTIME_T(i)); + latency_counter_add(l, TIME_T_TO_CDTIME_T(i)); } /* We expect a bucket width of 125ms. */ - EXPECT_EQ_UINT64 (DOUBLE_TO_CDTIME_T(0.125), peek->bin_width); + EXPECT_EQ_UINT64(DOUBLE_TO_CDTIME_T(0.125), peek->bin_width); struct { size_t index; int want; } bucket_cases[] = { - { 0, 0}, /* (0.000-0.125] */ - { 1, 0}, /* (0.125-0.250] */ - { 2, 0}, /* (0.250-0.375] */ - { 3, 0}, /* (0.375-0.500] */ - { 4, 0}, /* (0.500-0.625] */ - { 5, 0}, /* (0.625-0.750] */ - { 6, 0}, /* (0.750-0.875] */ - { 7, 1}, /* (0.875-1.000] */ - { 8, 0}, /* (1.000-1.125] */ - { 9, 0}, /* (1.125-1.250] */ - {10, 0}, /* (1.250-1.375] */ - {11, 0}, /* (1.375-1.500] */ - {12, 0}, /* (1.500-1.625] */ - {13, 0}, /* (1.625-1.750] */ - {14, 0}, /* (1.750-1.875] */ - {15, 1}, /* (1.875-2.000] */ - {16, 0}, /* (2.000-2.125] */ + {0, 0}, /* (0.000-0.125] */ + {1, 0}, /* (0.125-0.250] */ + {2, 0}, /* (0.250-0.375] */ + {3, 0}, /* (0.375-0.500] */ + {4, 0}, /* (0.500-0.625] */ + {5, 0}, /* (0.625-0.750] */ + {6, 0}, /* (0.750-0.875] */ + {7, 1}, /* (0.875-1.000] */ + {8, 0}, /* (1.000-1.125] */ + {9, 0}, /* (1.125-1.250] */ + {10, 0}, /* (1.250-1.375] */ + {11, 0}, /* (1.375-1.500] */ + {12, 0}, /* (1.500-1.625] */ + {13, 0}, /* (1.625-1.750] */ + {14, 0}, /* (1.750-1.875] */ + {15, 1}, /* (1.875-2.000] */ + {16, 0}, /* (2.000-2.125] */ }; for (size_t i = 0; i < STATIC_ARRAY_SIZE(bucket_cases); i++) { @@ -152,70 +157,78 @@ DEF_TEST (get_rate) { cdtime_t upper_bound; double want; } cases[] = { - { // bucket 6 is zero - DOUBLE_TO_CDTIME_T(0.750), - DOUBLE_TO_CDTIME_T(0.875), - 0.00, - }, - { // bucket 7 contains the t=1 update - DOUBLE_TO_CDTIME_T(0.875), - DOUBLE_TO_CDTIME_T(1.000), - 1.00, - }, - { // range: bucket 7 - bucket 15; contains the t=1 and t=2 updates - DOUBLE_TO_CDTIME_T(0.875), - DOUBLE_TO_CDTIME_T(2.000), - 2.00, - }, - { // lower bucket is only partially applied - DOUBLE_TO_CDTIME_T(0.875 + (0.125 / 4)), - DOUBLE_TO_CDTIME_T(2.000), - 1.75, - }, - { // upper bucket is only partially applied - DOUBLE_TO_CDTIME_T(0.875), - DOUBLE_TO_CDTIME_T(2.000 - (0.125 / 4)), - 1.75, - }, - { // both buckets are only partially applied - DOUBLE_TO_CDTIME_T(0.875 + (0.125 / 4)), - DOUBLE_TO_CDTIME_T(2.000 - (0.125 / 4)), - 1.50, - }, - { // lower bound is unspecified - 0, - DOUBLE_TO_CDTIME_T(2.000), - 2.00, - }, - { // upper bound is unspecified - DOUBLE_TO_CDTIME_T(125.000 - 0.125), - 0, - 1.00, - }, - { // overflow test - DOUBLE_TO_CDTIME_T(1.000), - DOUBLE_TO_CDTIME_T(999999), - 124.00, - }, + { + // bucket 6 is zero + DOUBLE_TO_CDTIME_T_STATIC(0.750), DOUBLE_TO_CDTIME_T_STATIC(0.875), + 0.00, + }, + { + // bucket 7 contains the t=1 update + DOUBLE_TO_CDTIME_T_STATIC(0.875), DOUBLE_TO_CDTIME_T_STATIC(1.000), + 1.00, + }, + { + // range: bucket 7 - bucket 15; contains the t=1 and t=2 updates + DOUBLE_TO_CDTIME_T_STATIC(0.875), DOUBLE_TO_CDTIME_T_STATIC(2.000), + 2.00, + }, + { + // lower bucket is only partially applied + DOUBLE_TO_CDTIME_T_STATIC(0.875 + (0.125 / 4)), + DOUBLE_TO_CDTIME_T_STATIC(2.000), 1.75, + }, + { + // upper bucket is only partially applied + DOUBLE_TO_CDTIME_T_STATIC(0.875), + DOUBLE_TO_CDTIME_T_STATIC(2.000 - (0.125 / 4)), 1.75, + }, + { + // both buckets are only partially applied + DOUBLE_TO_CDTIME_T_STATIC(0.875 + (0.125 / 4)), + DOUBLE_TO_CDTIME_T_STATIC(2.000 - (0.125 / 4)), 1.50, + }, + { + // lower bound is unspecified + 0, DOUBLE_TO_CDTIME_T_STATIC(2.000), 2.00, + }, + { + // upper bound is unspecified + DOUBLE_TO_CDTIME_T_STATIC(125.000 - 0.125), 0, 1.00, + }, + { + // overflow test: upper >> longest latency + DOUBLE_TO_CDTIME_T_STATIC(1.000), DOUBLE_TO_CDTIME_T_STATIC(999999), + 124.00, + }, + { + // overflow test: lower > longest latency + DOUBLE_TO_CDTIME_T_STATIC(130), 0, 0.00, + }, + { + // lower > upper => error + DOUBLE_TO_CDTIME_T_STATIC(10), DOUBLE_TO_CDTIME_T_STATIC(9), NAN, + }, + { + // lower == upper => zero + DOUBLE_TO_CDTIME_T_STATIC(9), DOUBLE_TO_CDTIME_T_STATIC(9), 0.00, + }, }; for (size_t i = 0; i < STATIC_ARRAY_SIZE(cases); i++) { cdtime_t now = peek->start_time + TIME_T_TO_CDTIME_T(1); - EXPECT_EQ_DOUBLE (cases[i].want, - latency_counter_get_rate (l, cases[i].lower_bound, cases[i].upper_bound, now)); + EXPECT_EQ_DOUBLE(cases[i].want, + latency_counter_get_rate(l, cases[i].lower_bound, + cases[i].upper_bound, now)); } - latency_counter_destroy (l); + latency_counter_destroy(l); return 0; } -int main (void) -{ +int main(void) { RUN_TEST(simple); RUN_TEST(percentile); RUN_TEST(get_rate); END_TEST; } - -/* vim: set sw=2 sts=2 et : */