blob: f8c7dc002e06540a942e8c26035c5682f9c2f866 [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>
26
27#include <stdio.h>
28
29static void stat_test(void)
30{
31 enum test_items {
32 TEST_A_ITEM,
33 TEST_B_ITEM,
34 };
35
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010036 static const struct osmo_stat_item_desc item_description[] = {
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020037 { "item.a", "The A value", "ma", 4, -1 },
38 { "item.b", "The B value", "kb", 7, -1 },
39 };
40
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010041 static const struct osmo_stat_item_group_desc statg_desc = {
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020042 .group_name_prefix = "test.one",
43 .group_description = "Test number 1",
44 .num_items = ARRAY_SIZE(item_description),
45 .item_desc = item_description,
46 };
47
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010048 struct osmo_stat_item_group *statg =
49 osmo_stat_item_group_alloc(NULL, &statg_desc, 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020050
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010051 struct osmo_stat_item_group *sgrp2;
52 const struct osmo_stat_item *sitem1, *sitem2;
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020053 int rc;
54 int32_t value;
55 int32_t rd_a = 0;
56 int32_t rd_b = 0;
57 int i;
58
59 OSMO_ASSERT(statg != NULL);
60
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010061 sgrp2 = osmo_stat_item_get_group_by_name_idx("test.one", 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020062 OSMO_ASSERT(sgrp2 == statg);
63
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010064 sgrp2 = osmo_stat_item_get_group_by_name_idx("test.one", 1);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020065 OSMO_ASSERT(sgrp2 == NULL);
66
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010067 sgrp2 = osmo_stat_item_get_group_by_name_idx("test.two", 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020068 OSMO_ASSERT(sgrp2 == NULL);
69
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010070 sitem1 = osmo_stat_item_get_by_name(statg, "item.c");
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020071 OSMO_ASSERT(sitem1 == NULL);
72
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010073 sitem1 = osmo_stat_item_get_by_name(statg, "item.a");
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020074 OSMO_ASSERT(sitem1 != NULL);
75 OSMO_ASSERT(sitem1 == statg->items[TEST_A_ITEM]);
76
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010077 sitem2 = osmo_stat_item_get_by_name(statg, "item.b");
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020078 OSMO_ASSERT(sitem2 != NULL);
79 OSMO_ASSERT(sitem2 != sitem1);
80 OSMO_ASSERT(sitem2 == statg->items[TEST_B_ITEM]);
81
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010082 value = osmo_stat_item_get_last(statg->items[TEST_A_ITEM]);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020083 OSMO_ASSERT(value == -1);
84
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010085 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020086 OSMO_ASSERT(rc == 0);
87
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010088 osmo_stat_item_set(statg->items[TEST_A_ITEM], 1);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020089
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010090 value = osmo_stat_item_get_last(statg->items[TEST_A_ITEM]);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020091 OSMO_ASSERT(value == 1);
92
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010093 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +020094 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020095 OSMO_ASSERT(value == 1);
96
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +010097 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +020098 OSMO_ASSERT(rc == 0);
99
100 for (i = 2; i <= 32; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100101 osmo_stat_item_set(statg->items[TEST_A_ITEM], i);
102 osmo_stat_item_set(statg->items[TEST_B_ITEM], 1000 + i);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200103
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100104 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200105 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200106 OSMO_ASSERT(value == i);
107
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100108 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200109 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200110 OSMO_ASSERT(value == 1000 + i);
111 }
112
113 /* Keep 2 in FIFO */
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100114 osmo_stat_item_set(statg->items[TEST_A_ITEM], 33);
115 osmo_stat_item_set(statg->items[TEST_B_ITEM], 1000 + 33);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200116
117 for (i = 34; i <= 64; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100118 osmo_stat_item_set(statg->items[TEST_A_ITEM], i);
119 osmo_stat_item_set(statg->items[TEST_B_ITEM], 1000 + i);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200120
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100121 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200122 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200123 OSMO_ASSERT(value == i-1);
124
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100125 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200126 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200127 OSMO_ASSERT(value == 1000 + i-1);
128 }
129
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100130 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200131 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200132 OSMO_ASSERT(value == 64);
133
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100134 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200135 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200136 OSMO_ASSERT(value == 1000 + 64);
137
138 /* Overrun FIFOs */
139 for (i = 65; i <= 96; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100140 osmo_stat_item_set(statg->items[TEST_A_ITEM], i);
141 osmo_stat_item_set(statg->items[TEST_B_ITEM], 1000 + i);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200142 }
143
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100144 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200145 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200146 OSMO_ASSERT(value == 93);
147
148 for (i = 94; i <= 96; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100149 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200150 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200151 OSMO_ASSERT(value == i);
152 }
153
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100154 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200155 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200156 OSMO_ASSERT(value == 1000 + 90);
157
158 for (i = 91; i <= 96; i++) {
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100159 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200160 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200161 OSMO_ASSERT(value == 1000 + i);
162 }
163
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200164 /* Test Discard (single item) */
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100165 osmo_stat_item_set(statg->items[TEST_A_ITEM], 97);
166 rc = osmo_stat_item_discard(statg->items[TEST_A_ITEM], &rd_a);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200167 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200168
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100169 rc = osmo_stat_item_discard(statg->items[TEST_A_ITEM], &rd_a);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200170 OSMO_ASSERT(rc == 0);
171
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100172 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200173 OSMO_ASSERT(rc == 0);
174
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100175 osmo_stat_item_set(statg->items[TEST_A_ITEM], 98);
176 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200177 OSMO_ASSERT(rc > 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200178 OSMO_ASSERT(value == 98);
179
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100180 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200181 OSMO_ASSERT(rc == 0);
182
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200183 /* Test Discard (all items) */
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100184 osmo_stat_item_set(statg->items[TEST_A_ITEM], 99);
185 osmo_stat_item_set(statg->items[TEST_A_ITEM], 100);
186 osmo_stat_item_set(statg->items[TEST_A_ITEM], 101);
187 osmo_stat_item_set(statg->items[TEST_B_ITEM], 99);
188 osmo_stat_item_set(statg->items[TEST_B_ITEM], 100);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200189
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100190 rc = osmo_stat_item_discard_all(&rd_a);
191 rc = osmo_stat_item_discard_all(&rd_b);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200192
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100193 rc = osmo_stat_item_get_next(statg->items[TEST_A_ITEM], &rd_a, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200194 OSMO_ASSERT(rc == 0);
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100195 rc = osmo_stat_item_get_next(statg->items[TEST_B_ITEM], &rd_b, &value);
Jacob Erlbeckb27b3522015-10-12 18:47:09 +0200196 OSMO_ASSERT(rc == 0);
197
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100198 osmo_stat_item_group_free(statg);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200199
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100200 sgrp2 = osmo_stat_item_get_group_by_name_idx("test.one", 0);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200201 OSMO_ASSERT(sgrp2 == NULL);
202}
203
204int main(int argc, char **argv)
205{
206 static const struct log_info log_info = {};
207 log_init(&log_info, NULL);
208
Jacob Erlbeckfc9533d2015-10-29 00:55:58 +0100209 osmo_stat_item_init(NULL);
Jacob Erlbeck9732cb42015-10-01 20:43:53 +0200210
211 stat_test();
212 return 0;
213}