X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Futils_latency_test.c;h=42a6e87ec79eab12c9fdc42148695f1a51a14d1e;hp=7d160398f978665aa5f3c2d8ddcd43cc335e0219;hb=77ca1a45bab2f6adf9301723d0db68e5813a6d98;hpb=79963d13c1884d1d92667cc502ad20758b084a12 diff --git a/src/utils_latency_test.c b/src/utils_latency_test.c index 7d160398..42a6e87e 100644 --- a/src/utils_latency_test.c +++ b/src/utils_latency_test.c @@ -24,10 +24,10 @@ * Florian octo Forster */ -#define DBL_PRECISION 1e-9 +#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_latency.h" @@ -52,7 +52,7 @@ DEF_TEST(simple) { 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, + 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)); @@ -101,11 +101,134 @@ DEF_TEST(percentile) { return 0; } +DEF_TEST(get_rate) { + /* We re-declare the struct here so we can inspect its content. */ + struct { + cdtime_t start_time; + cdtime_t sum; + size_t num; + cdtime_t min; + cdtime_t max; + cdtime_t bin_width; + int histogram[HISTOGRAM_NUM_BINS]; + } * peek; + latency_counter_t *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)); + } + + /* We expect a bucket width of 125ms. */ + 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] */ + }; + + for (size_t i = 0; i < STATIC_ARRAY_SIZE(bucket_cases); i++) { + size_t index = bucket_cases[i].index; + EXPECT_EQ_INT(bucket_cases[i].want, peek->histogram[index]); + } + + struct { + cdtime_t lower_bound; + cdtime_t upper_bound; + double want; + } cases[] = { + { + // 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)); + } + + latency_counter_destroy(l); + return 0; +} + int main(void) { RUN_TEST(simple); RUN_TEST(percentile); + RUN_TEST(get_rate); END_TEST; } - -/* vim: set sw=2 sts=2 et : */