blob: 59fc449cce1e56ff663eb4f8972b628b77ff6672 [file] [log] [blame]
Jacob Erlbeck9732cb42015-10-01 20:43:53 +02001/* tests for statistics */
2/*
3 * (C) 2015 Sysmocom s.m.f.c. GmbH
4 *
5 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 */
22
23#include <osmocom/core/logging.h>
24#include <osmocom/core/utils.h>
25#include <osmocom/core/stat_item.h>
Jacob Erlbeck46b703d2015-11-09 17:25:27 +010026#include <osmocom/core/rate_ctr.h>
27#include <osmocom/core/stats.h>
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020028
29#include <stdio.h>
Neels Hofmeyrb41b48e2017-01-13 00:11:34 +010030#include <inttypes.h>
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020031
Jacob Erlbeck46b703d2015-11-09 17:25:27 +010032enum test_ctr {
33 TEST_A_CTR,
34 TEST_B_CTR,
35};
36
37static const struct rate_ctr_desc ctr_description[] = {
Harald Weltea7a50652017-10-03 17:49:21 +080038 [TEST_A_CTR] = { "ctr:a", "The A counter value"},
39 [TEST_B_CTR] = { "ctr:b", "The B counter value"},
Jacob Erlbeck46b703d2015-11-09 17:25:27 +010040};
41
42static const struct rate_ctr_group_desc ctrg_desc = {
Harald Weltea7a50652017-10-03 17:49:21 +080043 .group_name_prefix = "ctr-test:one",
Jacob Erlbeck46b703d2015-11-09 17:25:27 +010044 .group_description = "Counter test number 1",
45 .num_ctr = ARRAY_SIZE(ctr_description),
46 .ctr_desc = ctr_description,
47 .class_id = OSMO_STATS_CLASS_SUBSCRIBER,
48};
49
Harald Welte04c88122017-10-03 18:34:48 +080050static const struct rate_ctr_desc ctr_description_dot[] = {
51 [TEST_A_CTR] = { "ctr.a", "The A counter value with ."},
52 [TEST_B_CTR] = { "ctr.b", "The B counter value with ."},
53};
54
55static const struct rate_ctr_group_desc ctrg_desc_dot = {
56 .group_name_prefix = "ctr-test.one_dot",
57 .group_description = "Counter test number 1dot",
58 .num_ctr = ARRAY_SIZE(ctr_description_dot),
59 .ctr_desc = ctr_description_dot,
60 .class_id = OSMO_STATS_CLASS_SUBSCRIBER,
61};
62
Jacob Erlbeck46b703d2015-11-09 17:25:27 +010063enum test_items {
64 TEST_A_ITEM,
65 TEST_B_ITEM,
66};
67
68static const struct osmo_stat_item_desc item_description[] = {
69 [TEST_A_ITEM] = { "item.a", "The A value", "ma", 4, -1 },
70 [TEST_B_ITEM] = { "item.b", "The B value", "kb", 7, -1 },
71};
72
73static const struct osmo_stat_item_group_desc statg_desc = {
74 .group_name_prefix = "test.one",
75 .group_description = "Test number 1",
76 .num_items = ARRAY_SIZE(item_description),
77 .item_desc = item_description,
78 .class_id = OSMO_STATS_CLASS_PEER,
79};
80
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020081static void stat_test(void)
82{
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010083 struct osmo_stat_item_group *statg =
84 osmo_stat_item_group_alloc(NULL, &statg_desc, 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020085
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010086 struct osmo_stat_item_group *sgrp2;
87 const struct osmo_stat_item *sitem1, *sitem2;
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020088 int rc;
89 int32_t value;
90 int32_t rd_a = 0;
91 int32_t rd_b = 0;
92 int i;
93
94 OSMO_ASSERT(statg != NULL);
95
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010096 sgrp2 = osmo_stat_item_get_group_by_name_idx("test.one", 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020097 OSMO_ASSERT(sgrp2 == statg);
98
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010099 sgrp2 = osmo_stat_item_get_group_by_name_idx("test.one", 1);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200100 OSMO_ASSERT(sgrp2 == NULL);
101
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100102 sgrp2 = osmo_stat_item_get_group_by_name_idx("test.two", 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200103 OSMO_ASSERT(sgrp2 == NULL);
104
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100105 sitem1 = osmo_stat_item_get_by_name(statg, "item.c");
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200106 OSMO_ASSERT(sitem1 == NULL);
107
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100108 sitem1 = osmo_stat_item_get_by_name(statg, "item.a");
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200109 OSMO_ASSERT(sitem1 != NULL);
110 OSMO_ASSERT(sitem1 == statg->items[TEST_A_ITEM]);
111
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100112 sitem2 = osmo_stat_item_get_by_name(statg, "item.b");
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200113 OSMO_ASSERT(sitem2 != NULL);
114 OSMO_ASSERT(sitem2 != sitem1);
115 OSMO_ASSERT(sitem2 == statg->items[TEST_B_ITEM]);
116
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100117 value = osmo_stat_item_get_last(statg->items[TEST_A_ITEM]);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200118 OSMO_ASSERT(value == -1);
119
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100120 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200121 OSMO_ASSERT(rc == 0);
122
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100123 osmo_stat_item_set(statg->items[TEST_A_ITEM], 1);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200124
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100125 value = osmo_stat_item_get_last(statg->items[TEST_A_ITEM]);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200126 OSMO_ASSERT(value == 1);
127
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100128 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200129 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200130 OSMO_ASSERT(value == 1);
131
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100132 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200133 OSMO_ASSERT(rc == 0);
134
135 for (i = 2; i <= 32; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100136 osmo_stat_item_set(statg->items[TEST_A_ITEM], i);
137 osmo_stat_item_set(statg->items[TEST_B_ITEM], 1000 + i);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200138
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100139 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200140 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200141 OSMO_ASSERT(value == i);
142
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100143 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200144 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200145 OSMO_ASSERT(value == 1000 + i);
146 }
147
148 /* Keep 2 in FIFO */
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100149 osmo_stat_item_set(statg->items[TEST_A_ITEM], 33);
150 osmo_stat_item_set(statg->items[TEST_B_ITEM], 1000 + 33);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200151
152 for (i = 34; i <= 64; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100153 osmo_stat_item_set(statg->items[TEST_A_ITEM], i);
154 osmo_stat_item_set(statg->items[TEST_B_ITEM], 1000 + i);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200155
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100156 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200157 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200158 OSMO_ASSERT(value == i-1);
159
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100160 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200161 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200162 OSMO_ASSERT(value == 1000 + i-1);
163 }
164
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100165 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200166 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200167 OSMO_ASSERT(value == 64);
168
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100169 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200170 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200171 OSMO_ASSERT(value == 1000 + 64);
172
173 /* Overrun FIFOs */
174 for (i = 65; i <= 96; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100175 osmo_stat_item_set(statg->items[TEST_A_ITEM], i);
176 osmo_stat_item_set(statg->items[TEST_B_ITEM], 1000 + i);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200177 }
178
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100179 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200180 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200181 OSMO_ASSERT(value == 93);
182
183 for (i = 94; i <= 96; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100184 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200185 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200186 OSMO_ASSERT(value == i);
187 }
188
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100189 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200190 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200191 OSMO_ASSERT(value == 1000 + 90);
192
193 for (i = 91; i <= 96; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100194 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200195 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200196 OSMO_ASSERT(value == 1000 + i);
197 }
198
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200199 /* Test Discard (single item) */
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100200 osmo_stat_item_set(statg->items[TEST_A_ITEM], 97);
201 rc = osmo_stat_item_discard(statg->items[TEST_A_ITEM], &rd_a);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200202 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200203
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100204 rc = osmo_stat_item_discard(statg->items[TEST_A_ITEM], &rd_a);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200205 OSMO_ASSERT(rc == 0);
206
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100207 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200208 OSMO_ASSERT(rc == 0);
209
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100210 osmo_stat_item_set(statg->items[TEST_A_ITEM], 98);
211 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200212 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200213 OSMO_ASSERT(value == 98);
214
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100215 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200216 OSMO_ASSERT(rc == 0);
217
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200218 /* Test Discard (all items) */
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100219 osmo_stat_item_set(statg->items[TEST_A_ITEM], 99);
220 osmo_stat_item_set(statg->items[TEST_A_ITEM], 100);
221 osmo_stat_item_set(statg->items[TEST_A_ITEM], 101);
222 osmo_stat_item_set(statg->items[TEST_B_ITEM], 99);
223 osmo_stat_item_set(statg->items[TEST_B_ITEM], 100);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200224
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100225 rc = osmo_stat_item_discard_all(&rd_a);
226 rc = osmo_stat_item_discard_all(&rd_b);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200227
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100228 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200229 OSMO_ASSERT(rc == 0);
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100230 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200231 OSMO_ASSERT(rc == 0);
232
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100233 osmo_stat_item_group_free(statg);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200234
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100235 sgrp2 = osmo_stat_item_get_group_by_name_idx("test.one", 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200236 OSMO_ASSERT(sgrp2 == NULL);
237}
238
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100239/*** stats reporter tests ***/
240
241/* define a special stats reporter for testing */
242
243static int send_count;
244
245enum {
246 OSMO_STATS_REPORTER_TEST = OSMO_STATS_REPORTER_LOG + 1,
247};
248
249static int stats_reporter_test_send_counter(struct osmo_stats_reporter *srep,
250 const struct rate_ctr_group *ctrg,
251 const struct rate_ctr_desc *desc,
252 int64_t value, int64_t delta)
253{
254 const char *group_name = ctrg ? ctrg->desc->group_name_prefix : "";
255
256 printf(" %s: counter p=%s g=%s i=%u n=%s v=%lld d=%lld\n",
257 srep->name,
258 srep->name_prefix ? srep->name_prefix : "",
259 group_name, ctrg ? ctrg->idx : 0,
260 desc->name, (long long)value, (long long)delta);
261
262 send_count += 1;
263 return 0;
264}
265
266static int stats_reporter_test_send_item(struct osmo_stats_reporter *srep,
267 const struct osmo_stat_item_group *statg,
Neels Hofmeyrb41b48e2017-01-13 00:11:34 +0100268 const struct osmo_stat_item_desc *desc, int64_t value)
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100269{
Neels Hofmeyrb41b48e2017-01-13 00:11:34 +0100270 printf(" %s: item p=%s g=%s i=%u n=%s v=%"PRId64" u=%s\n",
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100271 srep->name,
272 srep->name_prefix ? srep->name_prefix : "",
273 statg->desc->group_name_prefix, statg->idx,
274 desc->name, value, desc->unit ? desc->unit : "");
275
276 send_count += 1;
277 return 0;
278}
279
280static int stats_reporter_test_open(struct osmo_stats_reporter *srep)
281{
282 printf(" %s: open\n", srep->name);
283 return 0;
284}
285
286static int stats_reporter_test_close(struct osmo_stats_reporter *srep)
287{
288 printf(" %s: close\n", srep->name);
289 return 0;
290}
291
292static struct osmo_stats_reporter *stats_reporter_create_test(const char *name)
293{
294 struct osmo_stats_reporter *srep;
295 srep = osmo_stats_reporter_alloc(OSMO_STATS_REPORTER_TEST, name);
296
297 srep->have_net_config = 0;
298
299 srep->open = stats_reporter_test_open;
300 srep->close = stats_reporter_test_close;
301 srep->send_counter = stats_reporter_test_send_counter;
302 srep->send_item = stats_reporter_test_send_item;
303
304 return srep;
305}
306
307
308static void test_reporting()
309{
310 struct osmo_stats_reporter *srep1, *srep2, *srep;
311 struct osmo_stat_item_group *statg1, *statg2;
Harald Welte04c88122017-10-03 18:34:48 +0800312 struct rate_ctr_group *ctrg1, *ctrg2, *ctrg3;
Jacob Erlbeckf13de862015-11-10 11:36:58 +0100313 void *stats_ctx = talloc_named_const(NULL, 1, "stats test context");
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100314
315 int rc;
316
317 printf("Start test: %s\n", __func__);
318
319 /* Allocate counters and items */
Jacob Erlbeckf13de862015-11-10 11:36:58 +0100320 statg1 = osmo_stat_item_group_alloc(stats_ctx, &statg_desc, 1);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100321 OSMO_ASSERT(statg1 != NULL);
Jacob Erlbeckf13de862015-11-10 11:36:58 +0100322 statg2 = osmo_stat_item_group_alloc(stats_ctx, &statg_desc, 2);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100323 OSMO_ASSERT(statg2 != NULL);
Jacob Erlbeckf13de862015-11-10 11:36:58 +0100324 ctrg1 = rate_ctr_group_alloc(stats_ctx, &ctrg_desc, 1);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100325 OSMO_ASSERT(ctrg1 != NULL);
Jacob Erlbeckf13de862015-11-10 11:36:58 +0100326 ctrg2 = rate_ctr_group_alloc(stats_ctx, &ctrg_desc, 2);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100327 OSMO_ASSERT(ctrg2 != NULL);
Harald Welte04c88122017-10-03 18:34:48 +0800328 ctrg3 = rate_ctr_group_alloc(stats_ctx, &ctrg_desc_dot, 3);
329 OSMO_ASSERT(ctrg3 != NULL);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100330
331 srep1 = stats_reporter_create_test("test1");
332 OSMO_ASSERT(srep1 != NULL);
333
334 srep2 = stats_reporter_create_test("test2");
335 OSMO_ASSERT(srep2 != NULL);
336
337 srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_TEST, "test1");
338 OSMO_ASSERT(srep == srep1);
339 srep = osmo_stats_reporter_find(OSMO_STATS_REPORTER_TEST, "test2");
340 OSMO_ASSERT(srep == srep2);
341
342 rc = osmo_stats_reporter_enable(srep1);
343 OSMO_ASSERT(rc >= 0);
344 OSMO_ASSERT(srep1->force_single_flush);
345 rc = osmo_stats_reporter_set_max_class(srep1, OSMO_STATS_CLASS_SUBSCRIBER);
346 OSMO_ASSERT(rc >= 0);
347
348 rc = osmo_stats_reporter_enable(srep2);
349 OSMO_ASSERT(rc >= 0);
350 OSMO_ASSERT(srep2->force_single_flush);
351 rc = osmo_stats_reporter_set_max_class(srep2, OSMO_STATS_CLASS_SUBSCRIBER);
352 OSMO_ASSERT(rc >= 0);
353
354 printf("report (initial):\n");
355 send_count = 0;
356 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800357 OSMO_ASSERT(send_count == 20);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100358
359 printf("report (srep1 global):\n");
360 /* force single flush */
361 osmo_stats_reporter_set_max_class(srep1, OSMO_STATS_CLASS_GLOBAL);
362 srep1->force_single_flush = 1;
363 srep2->force_single_flush = 1;
364 send_count = 0;
365 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800366 OSMO_ASSERT(send_count == 10);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100367
368 printf("report (srep1 peer):\n");
369 /* force single flush */
370 osmo_stats_reporter_set_max_class(srep1, OSMO_STATS_CLASS_PEER);
371 srep1->force_single_flush = 1;
372 srep2->force_single_flush = 1;
373 send_count = 0;
374 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800375 OSMO_ASSERT(send_count == 14);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100376
377 printf("report (srep1 subscriber):\n");
378 /* force single flush */
379 osmo_stats_reporter_set_max_class(srep1, OSMO_STATS_CLASS_SUBSCRIBER);
380 srep1->force_single_flush = 1;
381 srep2->force_single_flush = 1;
382 send_count = 0;
383 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800384 OSMO_ASSERT(send_count == 20);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100385
386 printf("report (srep2 disabled):\n");
387 /* force single flush */
388 srep1->force_single_flush = 1;
389 srep2->force_single_flush = 1;
390 rc = osmo_stats_reporter_disable(srep2);
391 OSMO_ASSERT(rc >= 0);
392 send_count = 0;
393 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800394 OSMO_ASSERT(send_count == 10);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100395
396 printf("report (srep2 enabled, no flush forced):\n");
397 rc = osmo_stats_reporter_enable(srep2);
398 OSMO_ASSERT(rc >= 0);
399 send_count = 0;
400 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800401 OSMO_ASSERT(send_count == 10);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100402
403 printf("report (should be empty):\n");
404 send_count = 0;
405 osmo_stats_report();
406 OSMO_ASSERT(send_count == 0);
407
408 printf("report (group 1, counter 1 update):\n");
409 rate_ctr_inc(&ctrg1->ctr[TEST_A_CTR]);
410 send_count = 0;
411 osmo_stats_report();
412 OSMO_ASSERT(send_count == 2);
413
414 printf("report (group 1, item 1 update):\n");
415 osmo_stat_item_set(statg1->items[TEST_A_ITEM], 10);
416 send_count = 0;
417 osmo_stats_report();
418 OSMO_ASSERT(send_count == 2);
419
420 printf("report (remove statg1, ctrg1):\n");
421 /* force single flush */
422 srep1->force_single_flush = 1;
423 srep2->force_single_flush = 1;
424 osmo_stat_item_group_free(statg1);
425 rate_ctr_group_free(ctrg1);
426 send_count = 0;
427 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800428 OSMO_ASSERT(send_count == 12);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100429
430 printf("report (remove srep1):\n");
431 /* force single flush */
432 srep1->force_single_flush = 1;
433 srep2->force_single_flush = 1;
434 osmo_stats_reporter_free(srep1);
435 send_count = 0;
436 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800437 OSMO_ASSERT(send_count == 6);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100438
439 printf("report (remove statg2):\n");
440 /* force single flush */
441 srep2->force_single_flush = 1;
442 osmo_stat_item_group_free(statg2);
443 send_count = 0;
444 osmo_stats_report();
Harald Welte04c88122017-10-03 18:34:48 +0800445 OSMO_ASSERT(send_count == 4);
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100446
447 printf("report (remove srep2):\n");
448 /* force single flush */
449 srep2->force_single_flush = 1;
450 osmo_stats_reporter_free(srep2);
451 send_count = 0;
452 osmo_stats_report();
453 OSMO_ASSERT(send_count == 0);
454
455 printf("report (remove ctrg2, should be empty):\n");
456 rate_ctr_group_free(ctrg2);
457 send_count = 0;
458 osmo_stats_report();
459 OSMO_ASSERT(send_count == 0);
460
Harald Welte04c88122017-10-03 18:34:48 +0800461 rate_ctr_group_free(ctrg3);
462
Jacob Erlbeckf13de862015-11-10 11:36:58 +0100463 /* Leak check */
464 OSMO_ASSERT(talloc_total_blocks(stats_ctx) == 1);
465 talloc_free(stats_ctx);
466
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100467 printf("End test: %s\n", __func__);
468}
469
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200470int main(int argc, char **argv)
471{
472 static const struct log_info log_info = {};
473 log_init(&log_info, NULL);
474
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100475 osmo_stat_item_init(NULL);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200476
477 stat_test();
Jacob Erlbeck46b703d2015-11-09 17:25:27 +0100478 test_reporting();
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200479 return 0;
480}