From: Barbara Kaczorowska Date: Tue, 18 Aug 2020 10:29:28 +0000 (+0000) Subject: Implement tests for uc_get_percentile function X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6506bb0b6bf369edea2a97790ffa14de4c92ab80;p=thirdparty%2Fcollectd.git Implement tests for uc_get_percentile function --- diff --git a/src/daemon/utils_cache_test.c b/src/daemon/utils_cache_test.c index 7238122ef..9164a1393 100644 --- a/src/daemon/utils_cache_test.c +++ b/src/daemon/utils_cache_test.c @@ -30,7 +30,8 @@ #include "testing.h" #include "utils_cache.h" -static metric_family_t create_metric_family(char *name) { +/* TODO(bkjg): change all fams to pointers */ +static metric_family_t create_metric_family_test1(char *name) { metric_family_t fam = { .name = name, .type = METRIC_TYPE_DISTRIBUTION, @@ -68,7 +69,6 @@ DEF_TEST(uc_update) { } cases[] = { { .want_get = 0, - .updates = (double *[]){ (double[]){5.432, 5.4234, 6.3424, 7.5453, 902.3525, @@ -86,10 +86,11 @@ DEF_TEST(uc_update) { 78.57, 90.467, 89.658, 879.67}, }, .num_updates = (int[]){10, 16, 20}, - .fam = create_metric_family("abc"), + .fam = create_metric_family_test1("test1"), }, }; - for (int i = 0; i < (sizeof(cases) / sizeof(cases[0])); ++i) { + for (size_t i = 0; i < (sizeof(cases) / sizeof(cases[0])); ++i) { + printf("## Case %zu:\n", i); uc_init(); for (int k = 0; k < cases[i].fam.metric.num; ++k) { for (int j = 0; j < cases[i].num_updates[k]; ++j) { @@ -99,20 +100,302 @@ DEF_TEST(uc_update) { } } + /* TODO(bkjg): check if it was it updated for sure, for example: check if we + * can find it in the avl tree or so */ EXPECT_EQ_INT(cases[i].want_get, uc_update(&cases[i].fam)); - metric_family_metric_reset(&cases[i].fam); + CHECK_ZERO(metric_family_metric_reset(&cases[i].fam)); + } + + return 0; +} + +DEF_TEST(uc_get_percentile_by_name) { return 0; } + +static metric_family_t * +create_metric_family_for_get_percentile_test1(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_GAUGE; + + metric_t m = { + .value.gauge = 6.0, + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_test2(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_COUNTER; + + metric_t m = { + .value.counter = 45, + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_test3(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_UNTYPED; + + metric_t m = { + .value.gauge = 4.9, + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_test4(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_DISTRIBUTION; + + metric_t m = { + .value.distribution = NULL, + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_test5(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_DISTRIBUTION; + + metric_t m = { + .value.distribution = distribution_new_exponential(56, 1.24, 5), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_test6(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_DISTRIBUTION; + + metric_t m = { + .value.distribution = distribution_new_custom( + 8, (double[]){1.54, 3.543, 7.234, 78.435, 285.5435, 9023.53453, + 100043.43, 900000.43}), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_test7(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_DISTRIBUTION; + + metric_t m = { + .value.distribution = distribution_new_linear(68, 84.543), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_test8(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_DISTRIBUTION; + + metric_t m = { + .value.distribution = distribution_new_exponential(24, 1.345, 9.67), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_test9(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + fam->name = name; + fam->type = METRIC_TYPE_DISTRIBUTION; + + metric_t m = { + .value.distribution = distribution_new_custom( + 49, + (double[]){283.11051, 341.94139, 512.86531, 604.69627, 657.38026, + 868.54382, 1057.70293, 1441.49331, 1499.54159, 2011.40738, + 2135.40374, 2411.07421, 2658.56919, 2771.7077, 2913.22869, + 3171.10203, 3734.33039, 4004.57893, 4194.52351, 4209.34402, + 4395.85013, 4413.95106, 4575.35795, 4827.7257, 5012.33716, + 5579.60919, 5857.40106, 6154.67381, 6167.46927, 6183.56511, + 6247.11633, 6548.84595, 6798.12567, 6915.32327, 6975.11549, + 7010.67086, 7102.20424, 7296.39035, 7599.84557, 7621.5989, + 8055.85652, 8514.09805, 8786.67945, 8814.77247, 9421.52142, + 9584.05069, 9618.27028, 9788.40721, 9862.77031}), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +DEF_TEST(uc_get_percentile) { + struct { + int want_get; + double percent; + gauge_t ret_value; + gauge_t want_ret_value; + metric_family_t *fam; + double *updates; + int num_updates; + } cases[] = { + { + /* TODO(bkjg): maybe change the return value to EINVAL when the + argument is wrong instead of setting errno and returning -1 */ + .fam = create_metric_family_for_get_percentile_test1("test1"), + .want_get = -1, + .percent = 57.34, + }, + { + .fam = create_metric_family_for_get_percentile_test2("test2"), + .want_get = -1, + .percent = 49.23, + }, + { + .fam = create_metric_family_for_get_percentile_test3("test3"), + .want_get = -1, + .percent = 23.54, + }, + { + .fam = create_metric_family_for_get_percentile_test4("test4"), + .percent = 89.73, + .want_ret_value = NAN, + }, + { + .fam = create_metric_family_for_get_percentile_test5("test5"), + .want_get = -1, + .percent = -76, + }, + { + .fam = create_metric_family_for_get_percentile_test6("test6"), + .want_get = -1, + .percent = 100.4, + }, + { + .fam = create_metric_family_for_get_percentile_test7("test7"), + .percent = 0, + .num_updates = 9, + .updates = (double[]){1.354, 4.2343, 67.543, 7243.2435, 543.2543, + 54.43, 543.534, 9023.534, 2358453.534534}, + .want_ret_value = 84.543, + }, + { + .fam = create_metric_family_for_get_percentile_test8("test8"), + .percent = 100, + .num_updates = 15, + .updates = (double[]){7273.23889, 2332.61737, 5700.55615, 7812.98765, + 4264.86158, 268.74688, 6486.08937, 6204.44048, + 7235.73534, 2794.02672, 9288.39283, 4662.6566, + 6517.20614, 7785.61931, 8087.83614, 1094.24435, + 8093.33661, 2796.65101, 1425.40209, 2949.08743, + 3074.2948, 9631.15671, 1448.20895, 9843.30987, + 5045.33169, 6653.13623}, + .want_ret_value = INFINITY, + }, + { + .fam = create_metric_family_for_get_percentile_test9("test9"), + .percent = 56.3, + .num_updates = 54, + .updates = + (double[]){ + 9473.99522, 9682.46524, 6902.22386, 2632.59974, 224.97903, + 4425.67438, 1094.25828, 5507.07452, 6140.55588, 6586.78403, + 3748.51025, 7342.42407, 461.98087, 2370.005, 6234.53679, + 3630.13252, 9190.53656, 2377.16807, 2554.37586, 5973.07804, + 9459.471, 977.36175, 4707.95627, 9373.90178, 5625.67662, + 9200.20201, 2503.82766, 5539.63445, 8564.03697, 5179.19388, + 8530.74263, 3829.30061, 9251.19378, 8991.0057, 8464.4043, + 7580.73952, 9025.62113, 8952.42671, 9287.5265, 8579.52376, + 2938.24169, 1229.20803, 3995.36776, 2629.81514, 222.9282, + 321.08365, 958.73825, 393.90684, 7396.77622, 2706.27567, + 7376.80843, 3028.44747, 8684.45493, 8277.39937}, + .want_ret_value = 6154.67381, + }, + }; + + for (size_t i = 0; i < (sizeof(cases) / sizeof(cases[0])); ++i) { + printf("## Case %zu:\n", i); + + uc_init(); + + for (int j = 0; j < cases[i].num_updates; ++j) { + CHECK_ZERO(distribution_update( + cases[i].fam->metric.ptr[0].value.distribution, cases[i].updates[j])); + } + + CHECK_ZERO(uc_update(cases[i].fam)); + + EXPECT_EQ_INT(cases[i].want_get, + uc_get_percentile(&cases[i].fam->metric.ptr[0], + &cases[i].ret_value, cases[i].percent)); + + if (cases[i].want_get != -1) { + EXPECT_EQ_DOUBLE(cases[i].want_ret_value, cases[i].ret_value); + } + + CHECK_ZERO(metric_family_metric_reset(cases[i].fam)); + free(cases[i].fam); } return 0; } -DEF_TEST(uc_get_percentile) { return 0; } +DEF_TEST(uc_get_rate_by_name) { return 0; } DEF_TEST(uc_get_rate) { return 0; } int main() { RUN_TEST(uc_update); + RUN_TEST(uc_get_percentile_by_name); RUN_TEST(uc_get_percentile); + RUN_TEST(uc_get_rate_by_name); RUN_TEST(uc_get_rate); END_TEST;