blob: b46e9ac5da2d6323fb0037dc0ad568eaaa824906 [file] [log] [blame]
Max70c7d412017-02-24 13:59:14 +01001#include <stdio.h>
2#include <stdlib.h>
3#include <stdint.h>
4#include <string.h>
5#include <stdbool.h>
6
7#include <osmocom/core/utils.h>
8#include <osmocom/ctrl/control_cmd.h>
Neels Hofmeyr505c9652017-09-26 15:24:58 +02009#include <osmocom/core/logging.h>
10#include <osmocom/core/msgb.h>
11#include <osmocom/core/application.h>
Neels Hofmeyr83aee832017-12-16 05:38:37 +010012#include <osmocom/gsm/protocol/ipaccess.h>
13#include <osmocom/ctrl/control_if.h>
Max70c7d412017-02-24 13:59:14 +010014
Vadim Yanitskiyc2afe812017-06-13 01:43:23 +070015static void check_type(enum ctrl_type c)
Max70c7d412017-02-24 13:59:14 +010016{
17 const char *t = get_value_string(ctrl_type_vals, c);
18 int v = get_string_value(ctrl_type_vals, t);
19
20 printf("ctrl type %d is %s ", c, t);
21 if (v < 0)
22 printf("[PARSE FAILED]\n");
23 else
24 printf("-> %d %s\n", v, c != v ? "FAIL" : "OK");
25}
26
Neels Hofmeyr505c9652017-09-26 15:24:58 +020027struct msgb *msgb_from_string(const char *str)
28{
Neels Hofmeyr83aee832017-12-16 05:38:37 +010029 struct ipaccess_head *iph;
30 struct ipaccess_head_ext *ipx;
31 char *str_msg;
Neels Hofmeyr505c9652017-09-26 15:24:58 +020032 size_t len = strlen(str) + 1;
Neels Hofmeyr83aee832017-12-16 05:38:37 +010033
34 struct msgb *msg = msgb_alloc(1024, str);
35
36 iph = (void*)msgb_put(msg, sizeof(*iph));
37 iph->proto = IPAC_PROTO_OSMO;
38
39 ipx = (void*)msgb_put(msg, sizeof(*ipx));
40 ipx->proto = IPAC_PROTO_EXT_CTRL;
41
42 str_msg = (char*)msgb_put(msg, len);
43 msg->l2h = (void*)str_msg;
44 osmo_strlcpy(str_msg, str, len);
45
46 iph->len = msgb_length(msg);
Neels Hofmeyr505c9652017-09-26 15:24:58 +020047 return msg;
48}
49
50static void *ctx = NULL;
51
Neels Hofmeyr83aee832017-12-16 05:38:37 +010052struct one_test {
53 const char *cmd_str;
54 struct ctrl_cmd expect_parsed;
55 const char *reply_str;
56};
57
Neels Hofmeyr505c9652017-09-26 15:24:58 +020058void assert_same_str(const char *label, const char *expect, const char *got)
59{
60 if ((expect == got) || (expect && got && (strcmp(expect, got) == 0))) {
Neels Hofmeyr0ab6eca2017-12-16 01:03:37 +010061 printf("%s = '%s'\n", label, osmo_escape_str(got, -1));
Neels Hofmeyr505c9652017-09-26 15:24:58 +020062 return;
63 }
64
Neels Hofmeyr0ab6eca2017-12-16 01:03:37 +010065 printf("MISMATCH for '%s':\ngot: %s\n", label, osmo_escape_str(got, -1));
66 printf("expected: %s\n", osmo_escape_str(expect, -1));
Neels Hofmeyr505c9652017-09-26 15:24:58 +020067 OSMO_ASSERT(expect == got);
68}
69
Neels Hofmeyr83aee832017-12-16 05:38:37 +010070static void assert_test(struct ctrl_handle *ctrl, struct ctrl_connection *ccon, const struct one_test *t)
Neels Hofmeyr505c9652017-09-26 15:24:58 +020071{
72 struct ctrl_cmd *cmd;
Pau Espin Pedrolb885ef82018-07-12 19:29:23 +020073 bool parse_failed;
Neels Hofmeyr83aee832017-12-16 05:38:37 +010074 struct msgb *msg = msgb_from_string(t->cmd_str);
75 int ctx_size_was;
Neels Hofmeyr505c9652017-09-26 15:24:58 +020076
Neels Hofmeyr83aee832017-12-16 05:38:37 +010077 printf("test: '%s'\n", osmo_escape_str(t->cmd_str, -1));
78 printf("parsing:\n");
Neels Hofmeyr505c9652017-09-26 15:24:58 +020079
Pau Espin Pedrolb885ef82018-07-12 19:29:23 +020080 cmd = ctrl_cmd_parse3(ctx, msg, &parse_failed);
Neels Hofmeyr505c9652017-09-26 15:24:58 +020081 OSMO_ASSERT(cmd);
82
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +020083 if (t->expect_parsed.type != cmd->type) {
84 printf("type mismatch: got %s\n", get_value_string(ctrl_type_vals, cmd->type));
85 OSMO_ASSERT(t->expect_parsed.type == cmd->type);
Pau Espin Pedrolb885ef82018-07-12 19:29:23 +020086 } else {
87 printf("type = '%s'%s\n", get_value_string(ctrl_type_vals, cmd->type),
88 cmd->type != CTRL_TYPE_ERROR ? "" :
89 (parse_failed ? " (parse failure)" : " (error received)"));
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +020090 }
Neels Hofmeyr505c9652017-09-26 15:24:58 +020091
92#define ASSERT_SAME_STR(field) \
Neels Hofmeyr83aee832017-12-16 05:38:37 +010093 assert_same_str(#field, t->expect_parsed.field, cmd->field)
Neels Hofmeyr505c9652017-09-26 15:24:58 +020094
95 ASSERT_SAME_STR(id);
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +020096 if (t->expect_parsed.type != CTRL_TYPE_ERROR) {
97 ASSERT_SAME_STR(variable);
98 ASSERT_SAME_STR(value);
99 }
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200100 ASSERT_SAME_STR(reply);
101
102 talloc_free(cmd);
103 msgb_free(msg);
104
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100105 printf("handling:\n");
106
107 ctx_size_was = talloc_total_size(ctx);
108
109 msg = msgb_from_string(t->cmd_str);
110 ctrl_handle_msg(ctrl, ccon, msg);
111
112 if (llist_empty(&ccon->write_queue.msg_queue)) {
113 if (t->reply_str) {
114 printf("Got no reply, but expected \"%s\"\n", osmo_escape_str(t->reply_str, -1));
115 OSMO_ASSERT(!t->reply_str);
116 }
117 } else {
118 struct msgb *sent_msg = msgb_dequeue(&ccon->write_queue.msg_queue);
119 OSMO_ASSERT(sent_msg);
120 msgb_put_u8(sent_msg, 0);
121
122 printf("replied: '%s'\n", osmo_escape_str((char*)msgb_l2(sent_msg), -1));
123 OSMO_ASSERT(t->reply_str);
Alexander Couzens4e284b62019-06-23 01:53:43 +0200124 OSMO_ASSERT(!strcmp(t->reply_str, (char*)msgb_l2(sent_msg)));
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100125 msgb_free(sent_msg);
126 }
127 osmo_wqueue_clear(&ccon->write_queue);
128
129 msgb_free(msg);
130
131 if (talloc_total_size(ctx) != ctx_size_was) {
132 printf("mem leak!\n");
Neels Hofmeyrf2c10f12017-12-16 04:05:21 +0100133 talloc_report_full(ctx, stdout);
134 OSMO_ASSERT(false);
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100135 }
136
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200137 printf("ok\n");
138}
139
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100140static const struct one_test test_messages_list[] = {
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200141 { "GET 1 variable",
142 {
143 .type = CTRL_TYPE_GET,
144 .id = "1",
145 .variable = "variable",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100146 },
147 "ERROR 1 Command not found",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200148 },
149 { "GET 1 variable\n",
150 {
151 .type = CTRL_TYPE_GET,
152 .id = "1",
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200153 .variable = "variable",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100154 },
155 "ERROR 1 Command not found",
156
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200157 },
158 { "GET 1 var\ni\nable",
159 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200160 .type = CTRL_TYPE_ERROR,
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200161 .id = "1",
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200162 .reply = "GET with trailing characters",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100163 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200164 "ERROR 1 GET with trailing characters",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200165 },
Neels Hofmeyr1b8b1522017-12-15 20:41:28 +0100166 { "GET 1 var\ti\table",
167 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200168 .type = CTRL_TYPE_ERROR,
Neels Hofmeyr1b8b1522017-12-15 20:41:28 +0100169 .id = "1",
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200170 .reply = "GET variable contains invalid characters",
Neels Hofmeyr1b8b1522017-12-15 20:41:28 +0100171 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200172 "ERROR 1 GET variable contains invalid characters",
Neels Hofmeyr1b8b1522017-12-15 20:41:28 +0100173 },
174 { "GET 1 var\ri\rable",
175 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200176 .type = CTRL_TYPE_ERROR,
Neels Hofmeyr1b8b1522017-12-15 20:41:28 +0100177 .id = "1",
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200178 .reply = "GET variable contains invalid characters",
Neels Hofmeyr1b8b1522017-12-15 20:41:28 +0100179 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200180 "ERROR 1 GET variable contains invalid characters",
Neels Hofmeyr1b8b1522017-12-15 20:41:28 +0100181 },
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200182 { "GET 1 variable value",
183 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200184 .type = CTRL_TYPE_ERROR,
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200185 .id = "1",
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200186 .reply = "GET with trailing characters",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100187 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200188 "ERROR 1 GET with trailing characters",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200189 },
190 { "GET 1 variable value\n",
191 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200192 .type = CTRL_TYPE_ERROR,
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200193 .id = "1",
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200194 .reply = "GET with trailing characters",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100195 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200196 "ERROR 1 GET with trailing characters",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200197 },
198 { "GET 1 variable multiple value tokens",
199 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200200 .type = CTRL_TYPE_ERROR,
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200201 .id = "1",
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200202 .reply = "GET with trailing characters",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100203 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200204 "ERROR 1 GET with trailing characters",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200205 },
206 { "GET 1 variable multiple value tokens\n",
207 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200208 .type = CTRL_TYPE_ERROR,
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200209 .id = "1",
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200210 .reply = "GET with trailing characters",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100211 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200212 "ERROR 1 GET with trailing characters",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200213 },
214 { "SET 1 variable value",
215 {
216 .type = CTRL_TYPE_SET,
217 .id = "1",
218 .variable = "variable",
219 .value = "value",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100220 },
221 "ERROR 1 Command not found",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200222 },
223 { "SET 1 variable value\n",
224 {
225 .type = CTRL_TYPE_SET,
226 .id = "1",
227 .variable = "variable",
228 .value = "value",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100229 },
230 "ERROR 1 Command not found",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200231 },
232 { "SET weird_id variable value",
233 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200234 .type = CTRL_TYPE_ERROR,
235 .id = "err",
236 .reply = "Invalid message ID number",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100237 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200238 "ERROR err Invalid message ID number",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200239 },
240 { "SET weird_id variable value\n",
241 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200242 .type = CTRL_TYPE_ERROR,
243 .id = "err",
244 .reply = "Invalid message ID number",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100245 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200246 "ERROR err Invalid message ID number",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200247 },
248 { "SET 1 variable multiple value tokens",
249 {
250 .type = CTRL_TYPE_SET,
251 .id = "1",
252 .variable = "variable",
253 .value = "multiple value tokens",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100254 },
255 "ERROR 1 Command not found",
256
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200257 },
258 { "SET 1 variable multiple value tokens\n",
259 {
260 .type = CTRL_TYPE_SET,
261 .id = "1",
262 .variable = "variable",
263 .value = "multiple value tokens",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100264 },
265 "ERROR 1 Command not found",
266
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200267 },
268 { "SET 1 variable value_with_trailing_spaces ",
269 {
270 .type = CTRL_TYPE_SET,
271 .id = "1",
272 .variable = "variable",
273 .value = "value_with_trailing_spaces ",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100274 },
275 "ERROR 1 Command not found",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200276 },
277 { "SET 1 variable value_with_trailing_spaces \n",
278 {
279 .type = CTRL_TYPE_SET,
280 .id = "1",
281 .variable = "variable",
282 .value = "value_with_trailing_spaces ",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100283 },
284 "ERROR 1 Command not found",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200285 },
286 { "SET \n special_char_id value",
287 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200288 .type = CTRL_TYPE_ERROR,
289 .id = "err",
290 .reply = "Invalid message ID number",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100291 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200292 "ERROR err Invalid message ID number",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200293 },
294 { "SET \t special_char_id value",
295 {
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200296 .type = CTRL_TYPE_ERROR,
297 .id = "err",
298 .reply = "Invalid message ID number",
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100299 },
Neels Hofmeyr3da9aa62017-09-26 14:21:44 +0200300 "ERROR err Invalid message ID number",
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200301 },
Neels Hofmeyr6769ad62017-12-16 04:01:54 +0100302 { "GET_REPLY 1 variable OK",
303 {
304 .type = CTRL_TYPE_GET_REPLY,
305 .id = "1",
306 .variable = "variable",
307 .reply = "OK",
308 },
Neels Hofmeyr6769ad62017-12-16 04:01:54 +0100309 },
310 { "SET_REPLY 1 variable OK",
311 {
312 .type = CTRL_TYPE_SET_REPLY,
313 .id = "1",
314 .variable = "variable",
315 .reply = "OK",
316 },
Neels Hofmeyr6769ad62017-12-16 04:01:54 +0100317 },
Pau Espin Pedrolb885ef82018-07-12 19:29:23 +0200318 { "ERROR 1 some error message",
319 {
320 .type = CTRL_TYPE_ERROR,
321 .id = "1",
322 .reply = "some error message",
323 },
324 },
325 { "ERROR err some error message",
326 {
327 .type = CTRL_TYPE_ERROR,
328 .id = "err",
329 .reply = "some error message",
330 },
331 },
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200332};
333
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100334static void test_messages()
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200335{
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100336 struct ctrl_handle *ctrl;
337 struct ctrl_connection *ccon;
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200338 int i;
339
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100340 ctrl = ctrl_handle_alloc2(ctx, NULL, NULL, 0);
341 ccon = talloc_zero(ctx, struct ctrl_connection);
342
343 osmo_wqueue_init(&ccon->write_queue, 1);
344
345 for (i = 0; i < ARRAY_SIZE(test_messages_list); i++)
346 assert_test(ctrl, ccon, &test_messages_list[i]);
347
348 talloc_free(ccon);
349 talloc_free(ctrl);
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200350}
351
Neels Hofmeyr6882b802018-04-05 02:14:12 +0200352CTRL_CMD_DEFINE(test_defer, "test-defer");
353static void ctrl_test_defer_cb(void *data)
354{
355 struct ctrl_cmd_def *cd = data;
356 struct ctrl_cmd *cmd = cd->cmd;
357 static int i = 0;
358 printf("%s called\n", __func__);
359
360 if (ctrl_cmd_def_is_zombie(cd)) {
361 printf("Is Zombie\n");
362 return;
363 }
364
365 cmd->reply = talloc_asprintf(cmd, "Test Defer #%d", i++);
366
367 ctrl_cmd_def_send(cd);
368 return;
369}
370
371static struct ctrl_cmd_def *test_defer_cd = NULL;
372static int get_test_defer(struct ctrl_cmd *cmd, void *data)
373{
374 void *ctx = cmd->node;
375 printf("%s called\n", __func__);
376
377 test_defer_cd = ctrl_cmd_def_make(ctx, cmd, NULL, 10);
378
379 return CTRL_CMD_HANDLED;
380}
381static int set_test_defer(struct ctrl_cmd *cmd, void *data)
382{
383 return CTRL_CMD_HANDLED;
384}
385static int verify_test_defer(struct ctrl_cmd *cmd, const char *value, void *data)
386{
387 return 0;
388}
389
390static void test_deferred_cmd()
391{
392 struct ctrl_handle *ctrl;
393 struct ctrl_connection *ccon;
394 struct msgb *msg;
395 int result;
396 int ctx_size_was;
397 int ctx_size_before_defer;
398
399 printf("\n%s\n", __func__);
400 ctx_size_was = talloc_total_size(ctx);
401
402 ctrl = ctrl_handle_alloc2(ctx, NULL, NULL, 0);
403 ccon = talloc_zero(ctx, struct ctrl_connection);
404 INIT_LLIST_HEAD(&ccon->def_cmds);
405
406 osmo_wqueue_init(&ccon->write_queue, 1);
407
408 ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_test_defer);
409
410 ctx_size_before_defer = talloc_total_size(ctx);
411
412 msg = msgb_from_string("GET 123 test-defer");
413
414 result = ctrl_handle_msg(ctrl, ccon, msg);
415 printf("ctrl_handle_msg() returned %d\n", result);
416
417 OSMO_ASSERT(result == CTRL_CMD_HANDLED);
Neels Hofmeyra8b6cc42018-04-05 18:11:08 +0200418 talloc_free(msg);
Neels Hofmeyr6882b802018-04-05 02:14:12 +0200419
420 /* Expecting a ctrl_cmd_def as well as the cmd to still be allocated */
421 if (talloc_total_size(ctx) <= ctx_size_before_defer) {
422 printf("deferred command apparently deallocated too soon\n");
Neels Hofmeyr6882b802018-04-05 02:14:12 +0200423 talloc_report_full(ctx, stdout);
424 OSMO_ASSERT(false);
425 }
426
427 printf("invoking ctrl_test_defer_cb() asynchronously\n");
428 ctrl_test_defer_cb(test_defer_cd);
429
Neels Hofmeyra8b6cc42018-04-05 18:11:08 +0200430 /* simulate sending of the reply */
431 osmo_wqueue_clear(&ccon->write_queue);
432
Neels Hofmeyr6882b802018-04-05 02:14:12 +0200433 /* And now the deferred cmd should be cleaned up completely. */
434 if (talloc_total_size(ctx) != ctx_size_before_defer) {
435 printf("mem leak!\n");
436 talloc_report_full(ctx, stdout);
437 OSMO_ASSERT(false);
438 }
439
Neels Hofmeyr6882b802018-04-05 02:14:12 +0200440 talloc_free(ccon);
441 talloc_free(ctrl);
442
443 if (talloc_total_size(ctx) != ctx_size_was) {
444 printf("mem leak!\n");
445 talloc_report_full(ctx, stdout);
446 OSMO_ASSERT(false);
447 }
448
449 printf("success\n");
450}
451
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200452static struct log_info_cat test_categories[] = {
453};
454
455static struct log_info info = {
456 .cat = test_categories,
457 .num_cat = ARRAY_SIZE(test_categories),
458};
459
Max70c7d412017-02-24 13:59:14 +0100460int main(int argc, char **argv)
461{
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200462 ctx = talloc_named_const(NULL, 1, "ctrl_test");
Neels Hofmeyra8b6cc42018-04-05 18:11:08 +0200463 osmo_init_logging2(ctx, &info);
464 msgb_talloc_ctx_init(ctx, 0);
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200465
Max70c7d412017-02-24 13:59:14 +0100466 printf("Checking ctrl types...\n");
467
468 check_type(CTRL_TYPE_UNKNOWN);
469 check_type(CTRL_TYPE_GET);
470 check_type(CTRL_TYPE_SET);
471 check_type(CTRL_TYPE_GET_REPLY);
472 check_type(CTRL_TYPE_SET_REPLY);
473 check_type(CTRL_TYPE_TRAP);
474 check_type(CTRL_TYPE_ERROR);
475 check_type(64);
476
Neels Hofmeyr83aee832017-12-16 05:38:37 +0100477 test_messages();
Neels Hofmeyr505c9652017-09-26 15:24:58 +0200478
Neels Hofmeyr6882b802018-04-05 02:14:12 +0200479 test_deferred_cmd();
480
Neels Hofmeyra8b6cc42018-04-05 18:11:08 +0200481 /* Expecting root ctx + msgb root ctx + 5 logging elements */
482 if (talloc_total_blocks(ctx) != 7) {
483 talloc_report_full(ctx, stdout);
484 OSMO_ASSERT(false);
485 }
486
Max70c7d412017-02-24 13:59:14 +0100487 return 0;
488}