From 64581b01b20c9bccd99dd7ba0537e563ecfb4ca6 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Mon, 13 Jul 2015 11:30:16 +0200 Subject: [PATCH] src/utils_latency.c: Add unit test. This test successfully reproduces the crash reported in #1131 by calling latency_counter_add (l, DOUBLE_TO_CDTIME_T (-1.0)); --- src/Makefile.am | 12 +++-- src/testing.h | 6 ++- src/utils_latency_test.c | 105 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 src/utils_latency_test.c diff --git a/src/Makefile.am b/src/Makefile.am index 2c7c1821..cc6f62e6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -27,6 +27,13 @@ noinst_LTLIBRARIES = check_PROGRAMS = TESTS = +noinst_LTLIBRARIES += liblatency.la +liblatency_la_SOURCES = utils_latency.c utils_latency.h +check_PROGRAMS += test_utils_latency +TESTS += test_utils_latency +test_utils_latency_SOURCES = utils_latency_test.c testing.h +test_utils_latency_LDADD = liblatency.la daemon/libcommon.la daemon/libplugin_mock.la -lm + noinst_LTLIBRARIES += liblookup.la liblookup_la_SOURCES = utils_vl_lookup.c utils_vl_lookup.h liblookup_la_LIBADD = daemon/libavltree.la @@ -966,10 +973,9 @@ endif if BUILD_PLUGIN_STATSD pkglib_LTLIBRARIES += statsd.la -statsd_la_SOURCES = statsd.c \ - utils_latency.h utils_latency.c +statsd_la_SOURCES = statsd.c statsd_la_LDFLAGS = $(PLUGIN_LDFLAGS) -statsd_la_LIBADD = -lpthread -lm +statsd_la_LIBADD = liblatency.la -lpthread -lm endif if BUILD_PLUGIN_SWAP diff --git a/src/testing.h b/src/testing.h index 805449f7..84a12429 100644 --- a/src/testing.h +++ b/src/testing.h @@ -27,6 +27,10 @@ static int fail_count__ = 0; static int check_count__ = 0; +#ifndef DBL_PRECISION +# define DBL_PRECISION 1e-12 +#endif + #define DEF_TEST(func) static int test_##func () #define RUN_TEST(func) do { \ @@ -70,7 +74,7 @@ static int check_count__ = 0; printf ("not ok %i - %s incorrect: expected %.15g, got %.15g\n", \ ++check_count__, #actual, e, a); \ return (-1); \ - } else if (!isnan (e) && (((e-a) < -1e-12) || ((e-a) > 1e-12))) { \ + } else if (!isnan (e) && (((e-a) < -DBL_PRECISION) || ((e-a) > DBL_PRECISION))) { \ printf ("not ok %i - %s incorrect: expected %.15g, got %.15g\n", \ ++check_count__, #actual, e, a); \ return (-1); \ diff --git a/src/utils_latency_test.c b/src/utils_latency_test.c new file mode 100644 index 00000000..9aecf38c --- /dev/null +++ b/src/utils_latency_test.c @@ -0,0 +1,105 @@ +/** + * collectd - src/utils_latency_test.c + * Copyright (C) 2015 Florian octo Forster + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Florian octo Forster + */ + +#define DBL_PRECISION 1e-9 + +#include "testing.h" +#include "collectd.h" +#include "common.h" /* for STATIC_ARRAY_SIZE */ +#include "utils_time.h" +#include "utils_latency.h" + +DEF_TEST(simple) +{ + struct { + double val; + double min; + double max; + 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}, + { -1, 0.3, 2.5, 4.0, 1.0}, + }; + size_t i; + latency_counter_t *l; + + CHECK_NOT_NULL (l = latency_counter_create ()); + + for (i = 0; i < STATIC_ARRAY_SIZE (cases); i++) { + latency_counter_add (l, DOUBLE_TO_CDTIME_T (cases[i].val)); + + DBLEQ (cases[i].min, CDTIME_T_TO_DOUBLE (latency_counter_get_min (l))); + DBLEQ (cases[i].max, CDTIME_T_TO_DOUBLE (latency_counter_get_max (l))); + DBLEQ (cases[i].sum, CDTIME_T_TO_DOUBLE (latency_counter_get_sum (l))); + DBLEQ (cases[i].avg, CDTIME_T_TO_DOUBLE (latency_counter_get_average (l))); + } + + latency_counter_destroy (l); + return 0; +} + +DEF_TEST(percentile) +{ + size_t i; + latency_counter_t *l; + + CHECK_NOT_NULL (l = latency_counter_create ()); + + for (i = 0; i < 100; i++) { + latency_counter_add (l, TIME_T_TO_CDTIME_T (((time_t) i) + 1)); + } + + DBLEQ ( 1.0, CDTIME_T_TO_DOUBLE (latency_counter_get_min (l))); + DBLEQ (100.0, CDTIME_T_TO_DOUBLE (latency_counter_get_max (l))); + DBLEQ (100.0 * 101.0 / 2.0, CDTIME_T_TO_DOUBLE (latency_counter_get_sum (l))); + DBLEQ ( 50.5, CDTIME_T_TO_DOUBLE (latency_counter_get_average (l))); + + DBLEQ (50.0, CDTIME_T_TO_DOUBLE (latency_counter_get_percentile (l, 50.0))); + DBLEQ (80.0, CDTIME_T_TO_DOUBLE (latency_counter_get_percentile (l, 80.0))); + DBLEQ (95.0, CDTIME_T_TO_DOUBLE (latency_counter_get_percentile (l, 95.0))); + DBLEQ (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; +} + +int main (void) +{ + RUN_TEST(simple); + RUN_TEST(percentile); + + END_TEST; +} + +/* vim: set sw=2 sts=2 et : */ -- 2.30.2