blob: 4a4b121f09e0196565dcfe6fddd8b1743571cfa4 [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>
27
28#include <stdio.h>
29
30static void hexdump_test(void)
31{
32 uint8_t data[4098];
33 int i;
34
35 for (i = 0; i < ARRAY_SIZE(data); ++i)
36 data[i] = i & 0xff;
37
38 printf("Plain dump\n");
39 printf("%s\n", osmo_hexdump(data, 4));
40
41 printf("Corner case\n");
42 printf("%s\n", osmo_hexdump(data, ARRAY_SIZE(data)));
43 printf("%s\n", osmo_hexdump_nospc(data, ARRAY_SIZE(data)));
44}
45
Neels Hofmeyr7adb5672017-02-14 15:48:19 +010046static void hexparse_test(void)
47{
48 int i;
49 int rc;
50 uint8_t data[256];
51
52 printf("\nHexparse 0..255 in lower case\n");
53 memset(data, 0, sizeof(data));
54 rc = osmo_hexparse(
55 "000102030405060708090a0b0c0d0e0f"
56 "101112131415161718191a1b1c1d1e1f"
57 "202122232425262728292a2b2c2d2e2f"
58 "303132333435363738393a3b3c3d3e3f"
59 "404142434445464748494a4b4c4d4e4f"
60 "505152535455565758595a5b5c5d5e5f"
61 "606162636465666768696a6b6c6d6e6f"
62 "707172737475767778797a7b7c7d7e7f"
63 "808182838485868788898a8b8c8d8e8f"
64 "909192939495969798999a9b9c9d9e9f"
65 "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
66 "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
67 "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
68 "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
69 "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
70 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"
71 , data, sizeof(data));
72 printf("rc = %d\n", rc);
73 printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
74 for (i = 0; i < sizeof(data); i++)
75 OSMO_ASSERT(data[i] == i);
76
77 printf("Hexparse 0..255 in upper case\n");
78 memset(data, 0, sizeof(data));
79 rc = osmo_hexparse(
80 "000102030405060708090A0B0C0D0E0F"
81 "101112131415161718191A1B1C1D1E1F"
82 "202122232425262728292A2B2C2D2E2F"
83 "303132333435363738393A3B3C3D3E3F"
84 "404142434445464748494A4B4C4D4E4F"
85 "505152535455565758595A5B5C5D5E5F"
86 "606162636465666768696A6B6C6D6E6F"
87 "707172737475767778797A7B7C7D7E7F"
88 "808182838485868788898A8B8C8D8E8F"
89 "909192939495969798999A9B9C9D9E9F"
90 "A0A1A2A3A4A5A6A7A8A9AAABACADAEAF"
91 "B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF"
92 "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF"
93 "D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF"
94 "E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF"
95 "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF"
96 , data, sizeof(data));
97 printf("rc = %d\n", rc);
98 printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
99 for (i = 0; i < sizeof(data); i++)
100 OSMO_ASSERT(data[i] == i);
101
102 printf("Hexparse 0..255 in mixed case\n");
103 memset(data, 0, sizeof(data));
104 rc = osmo_hexparse(
105 "000102030405060708090A0B0C0D0E0F"
106 "101112131415161718191A1B1C1D1E1F"
107 "202122232425262728292A2B2C2D2E2F"
108 "303132333435363738393a3b3c3d3e3f"
109 "404142434445464748494A4B4C4D4E4F"
110 "505152535455565758595a5b5c5d5e5f"
111 "606162636465666768696A6B6C6D6E6F"
112 "707172737475767778797A7B7C7D7E7F"
113 "808182838485868788898A8B8C8D8E8F"
114 "909192939495969798999A9B9C9D9E9F"
115 "A0A1A2A3a4a5a6a7a8a9AAABACADAEAF"
116 "B0B1B2B3b4b5b6b7b8b9BABBBCBDBEBF"
117 "C0C1C2C3c4c5c6c7c8c9CACBCCCDCECF"
118 "D0D1D2D3d4d5d6d7d8d9DADBDCDDDEDF"
119 "E0E1E2E3e4e5e6e7e8e9EAEBECEDEEEF"
120 "F0F1F2F3f4f5f6f7f8f9FAFBFCFDFEFF"
121 , data, sizeof(data));
122 printf("rc = %d\n", rc);
123 printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
124 for (i = 0; i < sizeof(data); i++)
125 OSMO_ASSERT(data[i] == i);
126
Neels Hofmeyr437ed4a2017-02-14 15:54:31 +0100127 printf("Hexparse 0..255 with whitespace\n");
128 memset(data, 0, sizeof(data));
129 rc = osmo_hexparse(
130 "00 01\t02\r030405060708090A0B0C0D0 E 0 F\n"
131 "10 11\t12\r131415161718191A1B1C1D1 E 1 F\n"
132 "20 21\t22\r232425262728292A2B2C2D2 E 2 F\n"
133 "30 31\t32\r333435363738393a3b3c3d3 e 3 f\n"
134 "40 41\t42\r434445464748494A4B4C4D4 E 4 F\n"
135 "50 51\t52\r535455565758595a5b5c5d5 e 5 f\n"
136 "60 61\t62\r636465666768696A6B6C6D6 E 6 F\n"
137 "70 71\t72\r737475767778797A7B7C7D7 E 7 F\n"
138 "80 81\t82\r838485868788898A8B8C8D8 E 8 F\n"
139 "90 91\t92\r939495969798999A9B9C9D9 E 9 F\n"
140 "A0 A1\tA2\rA3a4a5a6a7a8a9AAABACADA E A F\n"
141 "B0 B1\tB2\rB3b4b5b6b7b8b9BABBBCBDB E B F\n"
142 "C0 C1\tC2\rC3c4c5c6c7c8c9CACBCCCDC E C F \n"
143 "D0 D1\tD2\rD3d4d5d6d7d8d9DADBDCDDD E D F\t\n"
144 "E0 E1\tE2\rE3e4e5e6e7e8e9EAEBECEDE E E F \t\n"
145 "F0 F1\tF2\rF3f4f5f6f7f8f9FAFBFCFDF E F F \t\r\n"
146 , data, sizeof(data));
147 printf("rc = %d\n", rc);
148 printf("--> %s\n\n", osmo_hexdump(data, sizeof(data)));
149 for (i = 0; i < sizeof(data); i++)
150 OSMO_ASSERT(data[i] == i);
151
Neels Hofmeyr7adb5672017-02-14 15:48:19 +0100152 printf("Hexparse with buffer too short\n");
153 memset(data, 0, sizeof(data));
154 rc = osmo_hexparse("000102030405060708090a0b0c0d0e0f", data, 15);
155 printf("rc = %d\n", rc);
156
157 printf("Hexparse with uneven amount of digits\n");
158 memset(data, 0, sizeof(data));
159 rc = osmo_hexparse("000102030405060708090a0b0c0d0e0", data, 16);
160 printf("rc = %d\n", rc);
161
162 printf("Hexparse with invalid char\n");
163 memset(data, 0, sizeof(data));
164 rc = osmo_hexparse("0001020304050X0708090a0b0c0d0e0f", data, 16);
165 printf("rc = %d\n", rc);
166}
167
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200168static void test_idtag_parsing(void)
169{
170 struct tlv_parsed tvp;
171 int rc;
172
173 static uint8_t data[] = {
174 0x01, 0x08,
175 0x01, 0x07,
176 0x01, 0x02,
177 0x01, 0x03,
178 0x01, 0x04,
179 0x01, 0x05,
180 0x01, 0x01,
181 0x01, 0x00,
182 0x11, 0x23, 0x4e, 0x6a, 0x28, 0xd2, 0xa2, 0x53, 0x3a, 0x2a, 0x82, 0xa7, 0x7a, 0xef, 0x29, 0xd4, 0x44, 0x30,
183 0x11, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
184 };
185
186 rc = ipa_ccm_idtag_parse_off(&tvp, data, sizeof(data), 1);
187 OSMO_ASSERT(rc == 0);
188
189 OSMO_ASSERT(TLVP_PRESENT(&tvp, 8));
190 OSMO_ASSERT(TLVP_LEN(&tvp, 8) == 0);
191
192 OSMO_ASSERT(TLVP_PRESENT(&tvp, 7));
193 OSMO_ASSERT(TLVP_LEN(&tvp, 7) == 0);
194
195 OSMO_ASSERT(TLVP_PRESENT(&tvp, 2));
196 OSMO_ASSERT(TLVP_LEN(&tvp, 2) == 0);
197
198 OSMO_ASSERT(TLVP_PRESENT(&tvp, 3));
199 OSMO_ASSERT(TLVP_LEN(&tvp, 3) == 0);
200
201 OSMO_ASSERT(TLVP_PRESENT(&tvp, 4));
202 OSMO_ASSERT(TLVP_LEN(&tvp, 4) == 0);
203
204 OSMO_ASSERT(TLVP_PRESENT(&tvp, 5));
205 OSMO_ASSERT(TLVP_LEN(&tvp, 5) == 0);
206
207 OSMO_ASSERT(TLVP_PRESENT(&tvp, 1));
208 OSMO_ASSERT(TLVP_LEN(&tvp, 1) == 0);
209
210 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0));
211 OSMO_ASSERT(TLVP_LEN(&tvp, 0) == 0);
212
213 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0x23));
214 OSMO_ASSERT(TLVP_LEN(&tvp, 0x23) == 16);
215
216 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0x24));
217 OSMO_ASSERT(TLVP_LEN(&tvp, 0x24) == 16);
218
219 OSMO_ASSERT(!TLVP_PRESENT(&tvp, 0x25));
220}
221
Neels Hofmeyr4335bad2017-10-07 04:39:14 +0200222static struct {
223 const char *str;
224 int min_digits;
225 int max_digits;
226 bool require_even;
227 bool expect_ok;
228} test_hexstrs[] = {
229 { NULL, 0, 10, false, true },
230 { NULL, 1, 10, false, false },
231 { "", 0, 10, false, true },
232 { "", 1, 10, false, false },
233 { " ", 0, 10, false, false },
234 { "1", 0, 10, false, true },
235 { "1", 1, 10, false, true },
236 { "1", 1, 10, true, false },
237 { "1", 2, 10, false, false },
238 { "123", 1, 10, false, true },
239 { "123", 1, 10, true, false },
240 { "123", 4, 10, false, false },
241 { "1234", 4, 10, true, true },
242 { "12345", 4, 10, true, false },
243 { "123456", 4, 10, true, true },
244 { "1234567", 4, 10, true, false },
245 { "12345678", 4, 10, true, true },
246 { "123456789", 4, 10, true, false },
247 { "123456789a", 4, 10, true, true },
248 { "123456789ab", 4, 10, true, false },
249 { "123456789abc", 4, 10, true, false },
250 { "123456789ab", 4, 10, false, false },
251 { "123456789abc", 4, 10, false, false },
252 { "0123456789abcdefABCDEF", 0, 100, false, true },
253 { "0123456789 abcdef ABCDEF", 0, 100, false, false },
254 { "foobar", 0, 100, false, false },
255 { "BeadedBeeAced1EbbedDefacedFacade", 32, 32, true, true },
256 { "C01ffedC1cadaeAc1d1f1edAcac1aB0a", 32, 32, false, true },
257 { "DeafBeddedBabeAcceededFadedDecaff", 32, 32, false, false },
258};
259
260bool test_is_hexstr()
261{
262 int i;
263 bool pass = true;
264 bool ok = true;
265 printf("\n----- %s\n", __func__);
266
267 for (i = 0; i < ARRAY_SIZE(test_hexstrs); i++) {
268 ok = osmo_is_hexstr(test_hexstrs[i].str,
269 test_hexstrs[i].min_digits,
270 test_hexstrs[i].max_digits,
271 test_hexstrs[i].require_even);
272 pass = pass && (ok == test_hexstrs[i].expect_ok);
273 printf("%2d: %s str='%s' min=%d max=%d even=%d expect=%s\n",
274 i, test_hexstrs[i].expect_ok == ok ? "pass" : "FAIL",
275 test_hexstrs[i].str,
276 test_hexstrs[i].min_digits,
277 test_hexstrs[i].max_digits,
278 test_hexstrs[i].require_even,
279 test_hexstrs[i].expect_ok ? "valid" : "invalid");
280 }
281 return pass;
282}
283
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100284int main(int argc, char **argv)
285{
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200286 static const struct log_info log_info = {};
287 log_init(&log_info, NULL);
288
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100289 hexdump_test();
Neels Hofmeyr7adb5672017-02-14 15:48:19 +0100290 hexparse_test();
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200291 test_idtag_parsing();
Neels Hofmeyr4335bad2017-10-07 04:39:14 +0200292 test_is_hexstr();
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100293 return 0;
294}