From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> --- tests/Makefile | 3 + tests/test-rolling-stats.c | 161 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 tests/test-rolling-stats.c
diff --git a/tests/Makefile b/tests/Makefile index 307035c..2d42eb2 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -72,6 +72,8 @@ check-unit-y += tests/test-qemu-opts$(EXESUF) gcov-files-test-qemu-opts-y = qom/test-qemu-opts.c check-unit-y += tests/test-write-threshold$(EXESUF) gcov-files-test-write-threshold-y = block/write-threshold.c +check-unit-y += tests/test-rolling-stats$(EXESUF) +gcov-files-test-rolling-stats = util/rolling-stats.c check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh @@ -367,6 +369,7 @@ tests/vhost-user-test$(EXESUF): tests/vhost-user-test.o qemu-char.o qemu-timer.o tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a libqemustub.a tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(block-obj-y) libqemuutil.a libqemustub.a +tests/test-rolling-stats$(EXESUF): tests/test-rolling-stats.o libqemuutil.a libqemustub.a ifeq ($(CONFIG_POSIX),y) LIBS += -lutil diff --git a/tests/test-rolling-stats.c b/tests/test-rolling-stats.c new file mode 100644 index 0000000..85dc949 --- /dev/null +++ b/tests/test-rolling-stats.c @@ -0,0 +1,161 @@ +/* + * Test rolling statistics framework + * + * Copyright 2015 Red Hat, Inc. and/or its affiliates + * + * Authors: + * Dr. David Alan Gilbert <dgilb...@redhat.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2 or later. + * See the COPYING.LIB file in the top-level directory. + * + */ + +#include "qemu-common.h" +#include "qemu/rolling-stats.h" + +static void test_1(void) +{ + RStats *r = rstats_init(5, 0.2); + char *str; + + str = rstats_as_pretty_string(r); + g_assert_cmpstr(str, ==, "Min/Max: 0, 0 Mean: 0 (Weighted: 0)" + " Count: 0 Values: "); + g_free(str); + str = rstats_as_json_string(r); + g_assert_cmpstr(str, ==, "{ \"min\": 0, \"max\": 0, \"mean\": 0," + " \"weighted_mean\": 0, \"count\": 0," + " \"values\": [ ] }"); + g_free(str); + + rstats_add_value(r, 1.0, 11); + str = rstats_as_pretty_string(r); + g_assert_cmpstr(str, ==, "Min/Max: 1, 1 Mean: 1 (Weighted: 1)" + " Count: 1 Values: 1@11"); + g_free(str); + str = rstats_as_json_string(r); + g_assert_cmpstr(str, ==, "{ \"min\": 1, \"max\": 1, \"mean\": 1," + " \"weighted_mean\": 1, \"count\": 1," + " \"values\": [" + " { \"value\": 1, \"tag\": 11 }" + " ] }"); + g_free(str); + + rstats_add_value(r, 2.0, 22); + str = rstats_as_pretty_string(r); + g_assert_cmpstr(str, ==, "Min/Max: 1, 2 Mean: 1.5 (Weighted: 1.8)" + " Count: 2 Values: 1@11, 2@22"); + g_free(str); + str = rstats_as_json_string(r); + g_assert_cmpstr(str, ==, "{ \"min\": 1, \"max\": 2, \"mean\": 1.5," + " \"weighted_mean\": 1.8, \"count\": 2," + " \"values\": [" + " { \"value\": 1, \"tag\": 11 }," + " { \"value\": 2, \"tag\": 22 }" + " ] }"); + g_free(str); + + rstats_add_value(r, -1.5, 33); + str = rstats_as_pretty_string(r); + g_assert_cmpstr(str, ==, "Min/Max: -1.5, 2 Mean: 0.5 (Weighted: -0.84)" + " Count: 3 Values: 1@11, 2@22, -1.5@33"); + g_free(str); + str = rstats_as_json_string(r); + g_assert_cmpstr(str, ==, "{ \"min\": -1.5, \"max\": 2, \"mean\": 0.5," + " \"weighted_mean\": -0.84, \"count\": 3," + " \"values\": [" + " { \"value\": 1, \"tag\": 11 }," + " { \"value\": 2, \"tag\": 22 }," + " { \"value\": -1.5, \"tag\": 33 }" + " ] }"); + g_free(str); + + rstats_add_value(r, 0.5, 44); + str = rstats_as_pretty_string(r); + g_assert_cmpstr(str, ==, "Min/Max: -1.5, 2 Mean: 0.5 (Weighted: 0.232)" + " Count: 4 Values: 1@11, 2@22, -1.5@33, 0.5@44"); + g_free(str); + str = rstats_as_json_string(r); + g_assert_cmpstr(str, ==, "{ \"min\": -1.5, \"max\": 2," + " \"mean\": 0.5," + " \"weighted_mean\": 0.232, \"count\": 4," + " \"values\": [" + " { \"value\": 1, \"tag\": 11 }," + " { \"value\": 2, \"tag\": 22 }," + " { \"value\": -1.5, \"tag\": 33 }," + " { \"value\": 0.5, \"tag\": 44 }" + " ] }"); + g_free(str); + + + rstats_add_value(r, 1000.123, 55); + str = rstats_as_pretty_string(r); + g_assert_cmpstr(str, ==, "Min/Max: -1.5, 1000.123 Mean: 200.4246" + " (Weighted: 800.1448)" + " Count: 5 Values: 1@11, 2@22, -1.5@33, 0.5@44" + ", 1000.123@55"); + g_free(str); + str = rstats_as_json_string(r); + g_assert_cmpstr(str, ==, "{ \"min\": -1.5, \"max\": 1000.123," + " \"mean\": 200.4246," + " \"weighted_mean\": 800.1448, \"count\": 5," + " \"values\": [" + " { \"value\": 1, \"tag\": 11 }," + " { \"value\": 2, \"tag\": 22 }," + " { \"value\": -1.5, \"tag\": 33 }," + " { \"value\": 0.5, \"tag\": 44 }," + " { \"value\": 1000.123, \"tag\": 55 }" + " ] }"); + g_free(str); + + /* + * We've got 5 spaces in the value array and this is the 6th value, + * so we start to overwrite. + */ + rstats_add_value(r, 10, 66); + str = rstats_as_pretty_string(r); + g_assert_cmpstr(str, ==, "Min/Max: -1.5, 1000.123 Mean: 202.2246" + " (Weighted: 168.02896)" + " Count: 6 Values: 2@22, -1.5@33, 0.5@44" + ", 1000.123@55, 10@66"); + g_free(str); + str = rstats_as_json_string(r); + g_assert_cmpstr(str, ==, "{ \"min\": -1.5, \"max\": 1000.123," + " \"mean\": 202.2246," + " \"weighted_mean\": 168.02896, \"count\": 6," + " \"values\": [" + " { \"value\": 2, \"tag\": 22 }," + " { \"value\": -1.5, \"tag\": 33 }," + " { \"value\": 0.5, \"tag\": 44 }," + " { \"value\": 1000.123, \"tag\": 55 }," + " { \"value\": 10, \"tag\": 66 }" + " ] }"); + g_free(str); + + + /* Try a reset */ + rstats_reset(r); + rstats_add_value(r, 30, 77); + str = rstats_as_pretty_string(r); + g_assert_cmpstr(str, ==, "Min/Max: 30, 30 Mean: 30" + " (Weighted: 30)" + " Count: 1 Values: 30@77"); + g_free(str); + str = rstats_as_json_string(r); + g_assert_cmpstr(str, ==, "{ \"min\": 30, \"max\": 30, \"mean\": 30," + " \"weighted_mean\": 30, \"count\": 1," + " \"values\": [" + " { \"value\": 30, \"tag\": 77 }" + " ] }"); + g_free(str); + + rstats_destroy(r); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + g_test_add_func("/utils/rolling_stats", test_1); + return g_test_run(); +} -- 2.1.0