blob: e3d6221f5ce2da561737535eb6054b026c9119d6 [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
127 printf("Hexparse with buffer too short\n");
128 memset(data, 0, sizeof(data));
129 rc = osmo_hexparse("000102030405060708090a0b0c0d0e0f", data, 15);
130 printf("rc = %d\n", rc);
131
132 printf("Hexparse with uneven amount of digits\n");
133 memset(data, 0, sizeof(data));
134 rc = osmo_hexparse("000102030405060708090a0b0c0d0e0", data, 16);
135 printf("rc = %d\n", rc);
136
137 printf("Hexparse with invalid char\n");
138 memset(data, 0, sizeof(data));
139 rc = osmo_hexparse("0001020304050X0708090a0b0c0d0e0f", data, 16);
140 printf("rc = %d\n", rc);
141}
142
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200143static void test_idtag_parsing(void)
144{
145 struct tlv_parsed tvp;
146 int rc;
147
148 static uint8_t data[] = {
149 0x01, 0x08,
150 0x01, 0x07,
151 0x01, 0x02,
152 0x01, 0x03,
153 0x01, 0x04,
154 0x01, 0x05,
155 0x01, 0x01,
156 0x01, 0x00,
157 0x11, 0x23, 0x4e, 0x6a, 0x28, 0xd2, 0xa2, 0x53, 0x3a, 0x2a, 0x82, 0xa7, 0x7a, 0xef, 0x29, 0xd4, 0x44, 0x30,
158 0x11, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
159 };
160
161 rc = ipa_ccm_idtag_parse_off(&tvp, data, sizeof(data), 1);
162 OSMO_ASSERT(rc == 0);
163
164 OSMO_ASSERT(TLVP_PRESENT(&tvp, 8));
165 OSMO_ASSERT(TLVP_LEN(&tvp, 8) == 0);
166
167 OSMO_ASSERT(TLVP_PRESENT(&tvp, 7));
168 OSMO_ASSERT(TLVP_LEN(&tvp, 7) == 0);
169
170 OSMO_ASSERT(TLVP_PRESENT(&tvp, 2));
171 OSMO_ASSERT(TLVP_LEN(&tvp, 2) == 0);
172
173 OSMO_ASSERT(TLVP_PRESENT(&tvp, 3));
174 OSMO_ASSERT(TLVP_LEN(&tvp, 3) == 0);
175
176 OSMO_ASSERT(TLVP_PRESENT(&tvp, 4));
177 OSMO_ASSERT(TLVP_LEN(&tvp, 4) == 0);
178
179 OSMO_ASSERT(TLVP_PRESENT(&tvp, 5));
180 OSMO_ASSERT(TLVP_LEN(&tvp, 5) == 0);
181
182 OSMO_ASSERT(TLVP_PRESENT(&tvp, 1));
183 OSMO_ASSERT(TLVP_LEN(&tvp, 1) == 0);
184
185 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0));
186 OSMO_ASSERT(TLVP_LEN(&tvp, 0) == 0);
187
188 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0x23));
189 OSMO_ASSERT(TLVP_LEN(&tvp, 0x23) == 16);
190
191 OSMO_ASSERT(TLVP_PRESENT(&tvp, 0x24));
192 OSMO_ASSERT(TLVP_LEN(&tvp, 0x24) == 16);
193
194 OSMO_ASSERT(!TLVP_PRESENT(&tvp, 0x25));
195}
196
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100197int main(int argc, char **argv)
198{
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200199 static const struct log_info log_info = {};
200 log_init(&log_info, NULL);
201
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100202 hexdump_test();
Neels Hofmeyr7adb5672017-02-14 15:48:19 +0100203 hexparse_test();
Holger Hans Peter Freytherf558ed42015-06-02 15:52:06 +0200204 test_idtag_parsing();
Holger Hans Peter Freytherb79a1482014-01-02 13:55:00 +0100205 return 0;
206}