blob: a146190d9f67c77af1fe5b9baaeb8811ad3a122e [file] [log] [blame]
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +01001/* tests for utilities of libmsomcore */
2/*
3 * (C) 2014 Holger Hans Peter Freyther
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
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +020023#include <osmocom/gsm/ipa.h>
24
25#include <osmocom/core/logging.h>
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +010026#include <osmocom/core/utils.h>
Neels Hofmeyr59f4caf2018-07-19 22:13:19 +020027#include <osmocom/core/socket.h>
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +010028
29#include <stdio.h>
Harald Welte504caac2017-10-27 17:19:59 +020030#include <ctype.h>
Harald Welte15a5f8d2018-06-06 16:58:17 +020031#include <time.h>
Neels Hofmeyr59f4caf2018-07-19 22:13:19 +020032#include <netinet/in.h>
33#include <arpa/inet.h>
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +010034
35static void hexdump_test(void)
36{
37 uint8_t data[4098];
38 int i;
39
40 for (i = 0; i < ARRAY_SIZE(data); ++i)
41 data[i] = i & 0xff;
42
43 printf("Plain dump\n");
44 printf("%s\n", osmo_hexdump(data, 4));
45
46 printf("Corner case\n");
47 printf("%s\n", osmo_hexdump(data, ARRAY_SIZE(data)));
48 printf("%s\n", osmo_hexdump_nospc(data, ARRAY_SIZE(data)));
49}
50
Neels Hofmeyr7adb5672017-02-14 15:48:19 +010051static void hexparse_test(void)
52{
53 int i;
54 int rc;
55 uint8_t data[256];
56
57 printf("\nHexparse 0..255 in lower case\n");
58 memset(data, 0, sizeof(data));
59 rc = osmo_hexparse(
60 "000102030405060708090a0b0c0d0e0f"
61 "101112131415161718191a1b1c1d1e1f"
62 "202122232425262728292a2b2c2d2e2f"
63 "303132333435363738393a3b3c3d3e3f"
64 "404142434445464748494a4b4c4d4e4f"
65 "505152535455565758595a5b5c5d5e5f"
66 "606162636465666768696a6b6c6d6e6f"
67 "707172737475767778797a7b7c7d7e7f"
68 "808182838485868788898a8b8c8d8e8f"
69 "909192939495969798999a9b9c9d9e9f"
70 "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
71 "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
72 "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
73 "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
74 "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
75 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"
76 , data, sizeof(data));
77 printf("rc = %d\n", rc);
78 printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
79 for (i = 0; i < sizeof(data); i++)
80 OSMO_ASSERT(data[i] == i);
81
82 printf("Hexparse 0..255 in upper case\n");
83 memset(data, 0, sizeof(data));
84 rc = osmo_hexparse(
85 "000102030405060708090A0B0C0D0E0F"
86 "101112131415161718191A1B1C1D1E1F"
87 "202122232425262728292A2B2C2D2E2F"
88 "303132333435363738393A3B3C3D3E3F"
89 "404142434445464748494A4B4C4D4E4F"
90 "505152535455565758595A5B5C5D5E5F"
91 "606162636465666768696A6B6C6D6E6F"
92 "707172737475767778797A7B7C7D7E7F"
93 "808182838485868788898A8B8C8D8E8F"
94 "909192939495969798999A9B9C9D9E9F"
95 "A0A1A2A3A4A5A6A7A8A9AAABACADAEAF"
96 "B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"
97 "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"
98 "D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF"
99 "E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF"
100 "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF"
101 , data, sizeof(data));
102 printf("rc = %d\n", rc);
103 printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
104 for (i = 0; i < sizeof(data); i++)
105 OSMO_ASSERT(data[i] == i);
106
107 printf("Hexparse 0..255 in mixed case\n");
108 memset(data, 0, sizeof(data));
109 rc = osmo_hexparse(
110 "000102030405060708090A0B0C0D0E0F"
111 "101112131415161718191A1B1C1D1E1F"
112 "202122232425262728292A2B2C2D2E2F"
113 "303132333435363738393a3b3c3d3e3f"
114 "404142434445464748494A4B4C4D4E4F"
115 "505152535455565758595a5b5c5d5e5f"
116 "606162636465666768696A6B6C6D6E6F"
117 "707172737475767778797A7B7C7D7E7F"
118 "808182838485868788898A8B8C8D8E8F"
119 "909192939495969798999A9B9C9D9E9F"
120 "A0A1A2A3a4a5a6a7a8a9AAABACADAEAF"
121 "B0B1B2B3b4b5b6b7b8b9BABBBCBDBEBF"
122 "C0C1C2C3c4c5c6c7c8c9CACBCCCDCECF"
123 "D0D1D2D3d4d5d6d7d8d9DADBDCDDDEDF"
124 "E0E1E2E3e4e5e6e7e8e9EAEBECEDEEEF"
125 "F0F1F2F3f4f5f6f7f8f9FAFBFCFDFEFF"
126 , data, sizeof(data));
127 printf("rc = %d\n", rc);
128 printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
129 for (i = 0; i < sizeof(data); i++)
130 OSMO_ASSERT(data[i] == i);
131
Neels Hofmeyr437ed4a2017-02-14 15:54:31 +0100132 printf("Hexparse 0..255 with whitespace\n");
133 memset(data, 0, sizeof(data));
134 rc = osmo_hexparse(
135 "00 01\t02\r030405060708090A0B0C0D0 E 0 F\n"
136 "10 11\t12\r131415161718191A1B1C1D1 E 1 F\n"
137 "20 21\t22\r232425262728292A2B2C2D2 E 2 F\n"
138 "30 31\t32\r333435363738393a3b3c3d3 e 3 f\n"
139 "40 41\t42\r434445464748494A4B4C4D4 E 4 F\n"
140 "50 51\t52\r535455565758595a5b5c5d5 e 5 f\n"
141 "60 61\t62\r636465666768696A6B6C6D6 E 6 F\n"
142 "70 71\t72\r737475767778797A7B7C7D7 E 7 F\n"
143 "80 81\t82\r838485868788898A8B8C8D8 E 8 F\n"
144 "90 91\t92\r939495969798999A9B9C9D9 E 9 F\n"
145 "A0 A1\tA2\rA3a4a5a6a7a8a9AAABACADA E A F\n"
146 "B0 B1\tB2\rB3b4b5b6b7b8b9BABBBCBDB E B F\n"
147 "C0 C1\tC2\rC3c4c5c6c7c8c9CACBCCCDC E C F \n"
148 "D0 D1\tD2\rD3d4d5d6d7d8d9DADBDCDDD E D F\t\n"
149 "E0 E1\tE2\rE3e4e5e6e7e8e9EAEBECEDE E E F \t\n"
150 "F0 F1\tF2\rF3f4f5f6f7f8f9FAFBFCFDF E F F \t\r\n"
151 , data, sizeof(data));
152 printf("rc = %d\n", rc);
153 printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
154 for (i = 0; i < sizeof(data); i++)
155 OSMO_ASSERT(data[i] == i);
156
Neels Hofmeyr7adb5672017-02-14 15:48:19 +0100157 printf("Hexparse with buffer too short\n");
158 memset(data, 0, sizeof(data));
159 rc = osmo_hexparse("000102030405060708090a0b0c0d0e0f", data, 15);
160 printf("rc = %d\n", rc);
161
162 printf("Hexparse with uneven amount of digits\n");
163 memset(data, 0, sizeof(data));
164 rc = osmo_hexparse("000102030405060708090a0b0c0d0e0", data, 16);
165 printf("rc = %d\n", rc);
166
167 printf("Hexparse with invalid char\n");
168 memset(data, 0, sizeof(data));
169 rc = osmo_hexparse("0001020304050X0708090a0b0c0d0e0f", data, 16);
170 printf("rc = %d\n", rc);
171}
172
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200173static void test_idtag_parsing(void)
174{
175 struct tlv_parsed tvp;
176 int rc;
177
178 static uint8_t data[] = {
179 0x01, 0x08,
180 0x01, 0x07,
181 0x01, 0x02,
182 0x01, 0x03,
183 0x01, 0x04,
184 0x01, 0x05,
185 0x01, 0x01,
186 0x01, 0x00,
187 0x11, 0x23, 0x4e, 0x6a, 0x28, 0xd2, 0xa2, 0x53, 0x3a, 0x2a, 0x82, 0xa7, 0x7a, 0xef, 0x29, 0xd4, 0x44, 0x30,
188 0x11, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
189 };
190
191 rc = ipa_ccm_idtag_parse_off(&tvp, data, sizeof(data), 1);
192 OSMO_ASSERT(rc == 0);
193
194 OSMO_ASSERT(TLVP_PRESENT(&tvp, 8));
195 OSMO_ASSERT(TLVP_LEN(&tvp, 8) == 0);
196
197 OSMO_ASSERT(TLVP_PRESENT(&tvp, 7));
198 OSMO_ASSERT(TLVP_LEN(&tvp, 7) == 0);
199
200 OSMO_ASSERT(TLVP_PRESENT(&tvp, 2));
201 OSMO_ASSERT(TLVP_LEN(&tvp, 2) == 0);
202
203 OSMO_ASSERT(TLVP_PRESENT(&tvp, 3));
204 OSMO_ASSERT(TLVP_LEN(&tvp, 3) == 0);
205
206 OSMO_ASSERT(TLVP_PRESENT(&tvp, 4));
207 OSMO_ASSERT(TLVP_LEN(&tvp, 4) == 0);
208
209 OSMO_ASSERT(TLVP_PRESENT(&tvp, 5));
210 OSMO_ASSERT(TLVP_LEN(&tvp, 5) == 0);
211
212 OSMO_ASSERT(TLVP_PRESENT(&tvp, 1));
213 OSMO_ASSERT(TLVP_LEN(&tvp, 1) == 0);
214
215 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0));
216 OSMO_ASSERT(TLVP_LEN(&tvp, 0) == 0);
217
218 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0x23));
219 OSMO_ASSERT(TLVP_LEN(&tvp, 0x23) == 16);
220
221 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0x24));
222 OSMO_ASSERT(TLVP_LEN(&tvp, 0x24) == 16);
223
224 OSMO_ASSERT(!TLVP_PRESENT(&tvp, 0x25));
225}
226
Neels Hofmeyr4335bad2017-10-07 04:39:14 +0200227static struct {
228 const char *str;
229 int min_digits;
230 int max_digits;
231 bool require_even;
232 bool expect_ok;
233} test_hexstrs[] = {
234 { NULL, 0, 10, false, true },
235 { NULL, 1, 10, false, false },
236 { "", 0, 10, false, true },
237 { "", 1, 10, false, false },
238 { " ", 0, 10, false, false },
239 { "1", 0, 10, false, true },
240 { "1", 1, 10, false, true },
241 { "1", 1, 10, true, false },
242 { "1", 2, 10, false, false },
243 { "123", 1, 10, false, true },
244 { "123", 1, 10, true, false },
245 { "123", 4, 10, false, false },
246 { "1234", 4, 10, true, true },
247 { "12345", 4, 10, true, false },
248 { "123456", 4, 10, true, true },
249 { "1234567", 4, 10, true, false },
250 { "12345678", 4, 10, true, true },
251 { "123456789", 4, 10, true, false },
252 { "123456789a", 4, 10, true, true },
253 { "123456789ab", 4, 10, true, false },
254 { "123456789abc", 4, 10, true, false },
255 { "123456789ab", 4, 10, false, false },
256 { "123456789abc", 4, 10, false, false },
257 { "0123456789abcdefABCDEF", 0, 100, false, true },
258 { "0123456789 abcdef ABCDEF", 0, 100, false, false },
259 { "foobar", 0, 100, false, false },
260 { "BeadedBeeAced1EbbedDefacedFacade", 32, 32, true, true },
261 { "C01ffedC1cadaeAc1d1f1edAcac1aB0a", 32, 32, false, true },
262 { "DeafBeddedBabeAcceededFadedDecaff", 32, 32, false, false },
263};
264
265bool test_is_hexstr()
266{
267 int i;
268 bool pass = true;
269 bool ok = true;
270 printf("\n----- %s\n", __func__);
271
272 for (i = 0; i < ARRAY_SIZE(test_hexstrs); i++) {
273 ok = osmo_is_hexstr(test_hexstrs[i].str,
274 test_hexstrs[i].min_digits,
275 test_hexstrs[i].max_digits,
276 test_hexstrs[i].require_even);
277 pass = pass && (ok == test_hexstrs[i].expect_ok);
278 printf("%2d: %s str='%s' min=%d max=%d even=%d expect=%s\n",
279 i, test_hexstrs[i].expect_ok == ok ? "pass" : "FAIL",
280 test_hexstrs[i].str,
281 test_hexstrs[i].min_digits,
282 test_hexstrs[i].max_digits,
283 test_hexstrs[i].require_even,
284 test_hexstrs[i].expect_ok ? "valid" : "invalid");
285 }
286 return pass;
287}
288
Harald Welte504caac2017-10-27 17:19:59 +0200289struct bcdcheck {
290 uint8_t bcd;
291 char ch;
292};
293
294static const struct bcdcheck bcdchecks[] = {
295 { 0, '0' },
296 { 1, '1' },
297 { 2, '2' },
298 { 3, '3' },
299 { 4, '4' },
300 { 5, '5' },
301 { 6, '6' },
302 { 7, '7' },
303 { 8, '8' },
304 { 9, '9' },
305 { 0xA, 'A' },
306 { 0xB, 'B' },
307 { 0xC, 'C' },
308 { 0xD, 'D' },
309 { 0xE, 'E' },
310 { 0xF, 'F' },
311};
312
313static void bcd_test(void)
314{
315 int i;
316
317 printf("\nTesting BCD conversion\n");
318 for (i = 0; i < ARRAY_SIZE(bcdchecks); i++) {
319 const struct bcdcheck *check = &bcdchecks[i];
320 char ch = osmo_bcd2char(check->bcd);
321 printf("\tval=0x%x, expected=%c, found=%c\n", check->bcd, check->ch, ch);
322 OSMO_ASSERT(osmo_bcd2char(check->bcd) == check->ch);
323 /* test char -> bcd back-coversion */
324 OSMO_ASSERT(osmo_char2bcd(ch) == check->bcd);
325 /* test for lowercase hex char */
326 OSMO_ASSERT(osmo_char2bcd(tolower(ch)) == check->bcd);
327 }
328}
329
Neels Hofmeyr9910bbc2017-12-16 00:54:52 +0100330static void str_escape_test(void)
331{
332 int i;
333 int j;
334 uint8_t in_buf[32];
335 char out_buf[11];
336 const char *printable = "printable";
337 const char *res;
338
339 printf("\nTesting string escaping\n");
340 printf("- all chars from 0 to 255 in batches of 16:\n");
Pau Espin Pedrol6de34ee2018-02-01 12:49:39 +0100341 in_buf[16] = '\0';
Neels Hofmeyr9910bbc2017-12-16 00:54:52 +0100342 for (j = 0; j < 16; j++) {
343 for (i = 0; i < 16; i++)
344 in_buf[i] = (j << 4) | i;
345 printf("\"%s\"\n", osmo_escape_str((const char*)in_buf, 16));
346 }
347
348 printf("- nul terminated:\n");
349 printf("\"%s\"\n", osmo_escape_str("termi\nated", -1));
350
351 printf("- passthru:\n");
352 res = osmo_escape_str(printable, -1);
353 if (res != printable)
354 printf("NOT passed through! \"%s\"\n", res);
355 else
356 printf("passed through unchanged \"%s\"\n", res);
357
358 printf("- zero length:\n");
359 printf("\"%s\"\n", osmo_escape_str("omitted", 0));
360
361 printf("- truncation when too long:\n");
362 memset(in_buf, 'x', sizeof(in_buf));
363 in_buf[0] = '\a';
364 in_buf[7] = 'E';
365 memset(out_buf, 0x7f, sizeof(out_buf));
366 printf("\"%s\"\n", osmo_escape_str_buf((const char *)in_buf, sizeof(in_buf), out_buf, 10));
367 OSMO_ASSERT(out_buf[10] == 0x7f);
368
369 printf("- passthrough without truncation when no escaping needed:\n");
370 memset(in_buf, 'x', sizeof(in_buf));
371 in_buf[19] = 'E';
372 in_buf[20] = '\0';
373 memset(out_buf, 0x7f, sizeof(out_buf));
374 printf("\"%s\"\n", osmo_escape_str_buf((const char *)in_buf, -1, out_buf, 10));
375 OSMO_ASSERT(out_buf[0] == 0x7f);
376}
377
Neels Hofmeyr04eb56f2018-04-09 00:41:28 +0200378static void str_quote_test(void)
379{
380 int i;
381 int j;
382 uint8_t in_buf[32];
383 char out_buf[11];
384 const char *printable = "printable";
385 const char *res;
386
387 printf("\nTesting string quoting\n");
388 printf("- all chars from 0 to 255 in batches of 16:\n");
389 in_buf[16] = '\0';
390 for (j = 0; j < 16; j++) {
391 for (i = 0; i < 16; i++)
392 in_buf[i] = (j << 4) | i;
393 printf("'%s'\n", osmo_quote_str((const char*)in_buf, 16));
394 }
395
396 printf("- nul terminated:\n");
397 printf("'%s'\n", osmo_quote_str("termi\nated", -1));
398
399 printf("- never passthru:\n");
400 res = osmo_quote_str(printable, -1);
401 if (res != printable)
402 printf("NOT passed through. '%s'\n", res);
403 else
404 printf("passed through unchanged '%s'\n", res);
405
406 printf("- zero length:\n");
407 printf("'%s'\n", osmo_quote_str("omitted", 0));
408
409 printf("- truncation when too long:\n");
410 memset(in_buf, 'x', sizeof(in_buf));
411 in_buf[0] = '\a';
412 in_buf[5] = 'E';
413 memset(out_buf, 0x7f, sizeof(out_buf));
414 printf("'%s'\n", osmo_quote_str_buf((const char *)in_buf, sizeof(in_buf), out_buf, 10));
415 OSMO_ASSERT(out_buf[10] == 0x7f);
416
417 printf("- always truncation, even when no escaping needed:\n");
418 memset(in_buf, 'x', sizeof(in_buf));
419 in_buf[6] = 'E'; /* dst has 10, less 2 quotes and nul, leaves 7, i.e. in[6] is last */
420 in_buf[20] = '\0';
421 memset(out_buf, 0x7f, sizeof(out_buf));
422 printf("'%s'\n", osmo_quote_str_buf((const char *)in_buf, -1, out_buf, 10));
423 OSMO_ASSERT(out_buf[0] == '"');
424
425 printf("- try to feed too little buf for quoting:\n");
426 printf("'%s'\n", osmo_quote_str_buf("", -1, out_buf, 2));
427
428 printf("- NULL string becomes a \"NULL\" literal:\n");
429 printf("'%s'\n", osmo_quote_str_buf(NULL, -1, out_buf, 10));
430}
431
Harald Welte15a5f8d2018-06-06 16:58:17 +0200432static void isqrt_test(void)
433{
434 int i;
435
436 printf("\nTesting integer square-root\n");
437 srand(time(NULL));
438 for (i = 0; i < 1024; i++) {
439 uint16_t x;
440 uint32_t r = rand();
441 if (RAND_MAX < UINT16_MAX)
442 x = r * (UINT16_MAX/RAND_MAX);
443 else
444 x = r;
Neels Hofmeyr6979c542018-07-19 22:05:21 +0200445 uint32_t sq = (uint32_t)x*x;
Harald Welte15a5f8d2018-06-06 16:58:17 +0200446 uint32_t y = osmo_isqrt32(sq);
447 if (y != x)
448 printf("ERROR: x=%u, sq=%u, osmo_isqrt(%u) = %u\n", x, sq, sq, y);
449 }
450}
451
Neels Hofmeyr59f4caf2018-07-19 22:13:19 +0200452
453struct osmo_sockaddr_to_str_and_uint_test_case {
454 uint16_t port;
455 bool omit_port;
456 const char *addr;
457 unsigned int addr_len;
458 bool omit_addr;
459 unsigned int expect_rc;
460 const char *expect_returned_addr;
461};
462
463struct osmo_sockaddr_to_str_and_uint_test_case osmo_sockaddr_to_str_and_uint_test_data[] = {
464 {
465 .port = 0,
466 .addr = "0.0.0.0",
467 .addr_len = 20,
468 .expect_rc = 7,
469 },
470 {
471 .port = 65535,
472 .addr = "255.255.255.255",
473 .addr_len = 20,
474 .expect_rc = 15,
475 },
476 {
477 .port = 1234,
478 .addr = "234.23.42.123",
479 .addr_len = 20,
480 .expect_rc = 13,
481 },
482 {
483 .port = 1234,
484 .addr = "234.23.42.123",
485 .addr_len = 10,
486 .expect_rc = 13,
487 .expect_returned_addr = "234.23.42",
488 },
489 {
490 .port = 1234,
491 .omit_port = true,
492 .addr = "234.23.42.123",
493 .addr_len = 20,
494 .expect_rc = 13,
495 },
496 {
497 .port = 1234,
498 .addr = "234.23.42.123",
499 .omit_addr = true,
500 .expect_rc = 0,
501 .expect_returned_addr = "",
502 },
503 {
504 .port = 1234,
505 .addr = "234.23.42.123",
506 .addr_len = 0,
507 .expect_rc = 13,
508 .expect_returned_addr = "",
509 },
510 {
511 .port = 1234,
512 .addr = "234.23.42.123",
513 .omit_port = true,
514 .omit_addr = true,
515 .expect_rc = 0,
516 .expect_returned_addr = "",
517 },
518};
519
520static void osmo_sockaddr_to_str_and_uint_test(void)
521{
522 int i;
523 printf("\n%s\n", __func__);
524
525 for (i = 0; i < ARRAY_SIZE(osmo_sockaddr_to_str_and_uint_test_data); i++) {
526 struct osmo_sockaddr_to_str_and_uint_test_case *t =
527 &osmo_sockaddr_to_str_and_uint_test_data[i];
528
529 struct sockaddr_in sin = {
530 .sin_family = AF_INET,
531 .sin_port = htons(t->port),
532 };
533 inet_aton(t->addr, &sin.sin_addr);
534
535 char addr[20] = {};
536 uint16_t port = 0;
537 unsigned int rc;
538
539 rc = osmo_sockaddr_to_str_and_uint(
540 t->omit_addr? NULL : addr, t->addr_len,
541 t->omit_port? NULL : &port,
542 (const struct sockaddr*)&sin);
543
544 printf("[%d] %s:%u%s%s addr_len=%u --> %s:%u rc=%u\n",
545 i,
546 t->addr ? : "-",
547 t->port,
548 t->omit_addr ? " (omit addr)" : "",
549 t->omit_port ? " (omit port)" : "",
550 t->addr_len,
551 addr, port, rc);
552 if (rc != t->expect_rc)
553 printf("ERROR: Expected rc = %u\n", t->expect_rc);
554 if (!t->expect_returned_addr)
555 t->expect_returned_addr = t->addr;
556 if (strcmp(t->expect_returned_addr, addr))
557 printf("ERROR: Expected addr = '%s'\n", t->expect_returned_addr);
558 if (!t->omit_port && port != t->port)
559 printf("ERROR: Expected port = %u\n", t->port);
560 }
561}
562
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100563int main(int argc, char **argv)
564{
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200565 static const struct log_info log_info = {};
566 log_init(&log_info, NULL);
567
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100568 hexdump_test();
Neels Hofmeyr7adb5672017-02-14 15:48:19 +0100569 hexparse_test();
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200570 test_idtag_parsing();
Neels Hofmeyr4335bad2017-10-07 04:39:14 +0200571 test_is_hexstr();
Harald Welte504caac2017-10-27 17:19:59 +0200572 bcd_test();
Neels Hofmeyr9910bbc2017-12-16 00:54:52 +0100573 str_escape_test();
Neels Hofmeyr04eb56f2018-04-09 00:41:28 +0200574 str_quote_test();
Harald Welte15a5f8d2018-06-06 16:58:17 +0200575 isqrt_test();
Neels Hofmeyr59f4caf2018-07-19 22:13:19 +0200576 osmo_sockaddr_to_str_and_uint_test();
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100577 return 0;
578}