From: Barbara Kaczorowska Date: Tue, 18 Aug 2020 14:52:44 +0000 (+0000) Subject: Implement tests for uc_get_percentile_by_name function X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f676f0d5f10d92f5715ac56fabb2b2e38a039f97;p=thirdparty%2Fcollectd.git Implement tests for uc_get_percentile_by_name function --- diff --git a/src/daemon/utils_cache_test.c b/src/daemon/utils_cache_test.c index 9164a1393..10ee619aa 100644 --- a/src/daemon/utils_cache_test.c +++ b/src/daemon/utils_cache_test.c @@ -31,30 +31,30 @@ #include "utils_cache.h" /* 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, - }; +static metric_family_t *create_metric_family_test1(char *name) { + metric_family_t *fam = calloc(1, sizeof(metric_family_t)); + + fam->name = name; + fam->type = METRIC_TYPE_DISTRIBUTION; metric_t m[] = {{ - .family = &fam, + .family = fam, .value.distribution = distribution_new_linear(5, 23), .time = cdtime_mock++, }, { - .family = &fam, + .family = fam, .value.distribution = distribution_new_linear(5, 23), .time = cdtime_mock++, }, { - .family = &fam, + .family = fam, .value.distribution = distribution_new_linear(5, 23), .time = cdtime_mock++, }}; for (int i = 0; i < (sizeof(m) / sizeof(m[0])); ++i) { - metric_family_metric_append(&fam, m[i]); + metric_family_metric_append(fam, m[i]); } return fam; @@ -65,7 +65,7 @@ DEF_TEST(uc_update) { int want_get; double **updates; int *num_updates; - metric_family_t fam; + metric_family_t *fam; } cases[] = { { .want_get = 0, @@ -86,31 +86,351 @@ DEF_TEST(uc_update) { 78.57, 90.467, 89.658, 879.67}, }, .num_updates = (int[]){10, 16, 20}, - .fam = create_metric_family_test1("test1"), + .fam = create_metric_family_test1("test1-update"), }, }; + uc_init(); 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 k = 0; k < cases[i].fam->metric.num; ++k) { for (int j = 0; j < cases[i].num_updates[k]; ++j) { CHECK_ZERO( - distribution_update(cases[i].fam.metric.ptr[k].value.distribution, + distribution_update(cases[i].fam->metric.ptr[k].value.distribution, cases[i].updates[k][j])); } } /* 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)); + EXPECT_EQ_INT(cases[i].want_get, uc_update(cases[i].fam)); - CHECK_ZERO(metric_family_metric_reset(&cases[i].fam)); + CHECK_ZERO(metric_family_metric_reset(cases[i].fam)); + free(cases[i].fam); } return 0; } -DEF_TEST(uc_get_percentile_by_name) { return 0; } +static metric_family_t * +create_metric_family_for_get_percentile_by_name_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 = 843.43, + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_by_name_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 = 593, + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_by_name_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 = 965.67, + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_by_name_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_by_name_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(104, 1.0012, 8), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_by_name_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( + 98, + (double[]){ + 1836.54646, 2590.13251, 11074.53839, 12667.70191, 16493.74399, + 17201.67548, 19654.09863, 19822.70671, 20219.84235, 20628.6294, + 21330.3241, 21835.60702, 22005.01013, 23060.45248, 23755.791, + 24345.93352, 24595.10389, 25076.58155, 27877.29969, 29174.41583, + 29356.96818, 30235.43401, 31973.82099, 32834.01715, 36895.83728, + 37756.94675, 38943.5799, 40728.19275, 40968.78746, 41013.32028, + 41643.66803, 41941.75445, 41968.68699, 42139.98045, 42171.18171, + 42563.64426, 42707.00144, 44633.4339, 45017.01279, 45030.25685, + 45341.78369, 46078.46776, 46961.65554, 49016.42988, 49746.57551, + 50113.49909, 50589.66556, 50693.99199, 51591.89517, 52126.52965, + 52297.96765, 52811.00834, 52952.61506, 53226.50739, 58331.95697, + 58763.57321, 59090.41844, 59838.52915, 61566.98641, 63679.9936, + 64845.77561, 65082.73513, 66327.92101, 66394.5264, 67929.13548, + 68336.25877, 68548.39663, 68701.53922, 68771.86106, 69873.86819, + 71036.25018, 74018.27601, 75350.4665, 75355.084, 76614.2913, + 78877.96414, 79371.25209, 80041.87913, 80321.92699, 81510.64319, + 82640.81058, 84725.19083, 84789.66383, 85361.16797, 88086.65824, + 88308.13984, 90015.37417, 91817.05354, 91913.38988, 92477.00628, + 93033.2967, 94944.94684, 95986.58155, 96384.70299, 96657.04388, + 98245.02403, 99031.53623, 99147.69204}), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_by_name_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(193, 47.97), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_by_name_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(74, 1.065, 45.784), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +static metric_family_t * +create_metric_family_for_get_percentile_by_name_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( + 26, (double[]){7174.31149, 14377.23879, 19392.54763, 21299.07721, + 24435.75879, 34705.8173, 35494.67336, 45019.09439, + 48184.06042, 51450.77931, 53363.60859, 55081.31397, + 55968.203, 64090.62914, 75022.61352, 79168.79336, + 79769.46266, 79982.26847, 82362.20702, 83499.3666, + 84368.98886, 86621.73007, 94893.89038, 95883.59771, + 96327.48458, 97958.59675}), + .family = fam, + .time = cdtime_mock++, + }; + + metric_family_metric_append(fam, m); + + return fam; +} + +DEF_TEST(uc_get_percentile_by_name) { + 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_by_name_test1( + "test1-percentile-by-name"), + .want_get = -1, + .percent = 57.34, + }, + { + .fam = create_metric_family_for_get_percentile_by_name_test2( + "test2-percentile-by-name"), + .want_get = -1, + .percent = 49.23, + }, + { + .fam = create_metric_family_for_get_percentile_by_name_test3( + "test3-percentile-by-name"), + .want_get = -1, + .percent = 23.54, + }, + { + .fam = create_metric_family_for_get_percentile_by_name_test4( + "test4-percentile-by-name"), + .percent = 89.73, + .want_ret_value = NAN, + }, + { + .fam = create_metric_family_for_get_percentile_by_name_test5( + "test5-percentile-by-name"), + .want_get = -1, + .percent = -76, + }, + { + .fam = create_metric_family_for_get_percentile_by_name_test6( + "test6-percentile-by-name"), + .want_get = -1, + .percent = 100.4, + }, + { + .fam = create_metric_family_for_get_percentile_by_name_test7( + "test7-percentile-by-name"), + .percent = 0, + .num_updates = 71, + .updates = + (double[]){82359.12294, 68158.41378, 48412.81238, 5904.4289, + 34826.95792, 57900.41609, 33671.55587, 24959.94718, + 93646.26915, 1520.75565, 14639.69397, 70222.39415, + 21981.56962, 16146.0281, 13983.92362, 52167.56135, + 27539.19779, 45057.29114, 3319.77024, 34066.56465, + 10173.62876, 91667.04402, 98416.81719, 96030.39534, + 79983.43468, 77316.03541, 5659.02605, 55984.92588, + 77457.94164, 3384.64733, 72593.37989, 66288.34529, + 17548.12711, 39080.58183, 70098.8097, 64922.09787, + 38622.17965, 63267.44964, 80319.19425, 57421.82315, + 54532.87389, 23394.05223, 6053.33071, 81659.40367, + 38240.65576, 85423.95662, 54837.08557, 30067.92726, + 60829.11685, 5428.52609, 6612.06311, 70475.98393, + 85464.98161, 20740.81419, 43986.23893, 70876.29799, + 1037.86676, 76031.71462, 53813.00219, 4035.65718, + 5811.23089, 58692.27907, 94178.50533, 12500.30161, + 81487.15188, 69029.50582, 49662.02744, 73422.53592, + 68386.53142, 91320.37996, 91735.92333}, + .want_ret_value = 47.97, + }, + { + .fam = create_metric_family_for_get_percentile_by_name_test8( + "test8-percentile-by-name"), + .percent = 100, + .num_updates = 42, + .updates = + (double[]){72506.34561, 91418.8635, 80572.52619, 38484.68244, + 87877.24226, 57174.59598, 1551.41153, 9145.58047, + 72967.20258, 53348.1573, 48132.4808, 39831.68688, + 78359.72224, 76905.47862, 5348.62723, 8070.63794, + 11716.49737, 29432.91898, 67222.86733, 29114.50366, + 67117.86881, 15388.23779, 48933.6252, 74134.36183, + 24786.55592, 42282.17781, 87869.09351, 26252.42492, + 7323.72669, 47943.4361, 29671.97547, 6225.43339, + 44457.12541, 34822.90173, 50059.94181, 26860.86093, + 71182.72552, 65944.4019, 21285.09149, 19641.2854, + 19254.37358, 61342.40975}, + .want_ret_value = INFINITY, + }, + { + .fam = create_metric_family_for_get_percentile_by_name_test9( + "test9-percentile-by-name"), + .percent = 42.3, + .num_updates = 38, + .updates = + (double[]){71079.41279, 64378.08534, 58308.74218, 62899.70407, + 43084.69866, 59286.43609, 95311.89101, 46082.97057, + 21002.88808, 13767.93511, 6832.77194, 9641.53968, + 93547.80996, 53104.75652, 30484.31134, 63405.23635, + 87195.96601, 91571.10233, 10134.44248, 63686.4723, + 323.06071, 48039.79776, 84822.6203, 89630.53538, + 15187.56664, 76056.39513, 91604.62264, 47667.05402, + 11471.67096, 82920.8644, 57711.02046, 73579.12752, + 35093.01442, 95393.57805, 17610.14104, 54931.47418, + 19359.63012, 46414.44434}, + .want_ret_value = 48184.06042, + }, + }; + + uc_init(); + for (size_t i = 0; i < (sizeof(cases) / sizeof(cases[0])); ++i) { + printf("## Case %zu:\n", i); + 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_by_name(cases[i].fam->name, + &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; +} static metric_family_t * create_metric_family_for_get_percentile_test1(char *name) { @@ -325,7 +645,7 @@ DEF_TEST(uc_get_percentile) { .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, + .want_ret_value = 84.543, }, { .fam = create_metric_family_for_get_percentile_test8("test8"), @@ -338,7 +658,7 @@ DEF_TEST(uc_get_percentile) { 8093.33661, 2796.65101, 1425.40209, 2949.08743, 3074.2948, 9631.15671, 1448.20895, 9843.30987, 5045.33169, 6653.13623}, - .want_ret_value = INFINITY, + .want_ret_value = INFINITY, }, { .fam = create_metric_family_for_get_percentile_test9("test9"), @@ -357,15 +677,14 @@ DEF_TEST(uc_get_percentile) { 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, + .want_ret_value = 6154.67381, }, }; + uc_init(); 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])); @@ -384,6 +703,8 @@ DEF_TEST(uc_get_percentile) { CHECK_ZERO(metric_family_metric_reset(cases[i].fam)); free(cases[i].fam); } + // reset_cache_tree(); + return 0; }