blob: 755b3213aba5ec9a130848ed64e8b691b2d50c5c [file] [log] [blame]
Harald Welteec8b4502010-02-20 20:34:29 +01001/*
2 * (C) 2008 by Daniel Willmann <daniel@totalueberwachung.de>
Nico Golde28de0532010-07-09 17:19:12 +02003 * (C) 2010 by Nico Golde <nico@ngolde.de>
Harald Welteec8b4502010-02-20 20:34:29 +01004 * All Rights Reserved
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 */
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +020025
26#include <osmocom/gsm/protocol/gsm_03_40.h>
27
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010028#include <osmocom/gsm/gsm_utils.h>
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +020029#include <osmocom/gsm/gsm0411_utils.h>
30
31#include <osmocom/core/msgb.h>
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010032#include <osmocom/core/utils.h>
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080033
34struct test_case {
35 const uint8_t *input;
36 const uint16_t input_length;
37
38 const uint8_t *expected;
Dennis Wehrle291e6132011-07-24 20:14:13 +020039 const uint16_t expected_octet_length;
40 const uint16_t expected_septet_length;
41 const uint8_t ud_hdr_ind;
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080042};
43
44static const char simple_text[] = "test text";
Dennis Wehrle291e6132011-07-24 20:14:13 +020045#define simple_septet_length 9
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080046static const uint8_t simple_enc[] = {
Nico Goldec0ce9aa2010-07-20 15:43:58 +020047 0xf4, 0xf2, 0x9c, 0x0e, 0xa2, 0x97, 0xf1, 0x74
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080048};
49
Dennis Wehrle291e6132011-07-24 20:14:13 +020050static const char escape_text[] = "!$ a more#^- complicated test@@?_%! case";
51#define escape_septet_length 41 /* note: the ^ counts as two, because it is a extension character */
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080052static const uint8_t escape_enc[] = {
53 0x21, 0x01, 0x28, 0x0c, 0x6a, 0xbf, 0xe5, 0xe5, 0xd1,
54 0x86, 0xd2, 0x02, 0x8d, 0xdf, 0x6d, 0x38, 0x3b, 0x3d,
55 0x0e, 0xd3, 0xcb, 0x64, 0x10, 0xbd, 0x3c, 0xa7, 0x03,
56 0x00, 0xbf, 0x48, 0x29, 0x04, 0x1a, 0x87, 0xe7, 0x65,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +080057};
58
Dennis Wehrle291e6132011-07-24 20:14:13 +020059static const char enhanced_text[] = "enhanced ^ {][} test |+~ ^ test";
60#define enhanced_septet_length 39 /* note: the characters { } [ ] ^ | ~ count as two (each of them), because they are extension characters */
61static const uint8_t enhanced_enc[] = {
62 0x65, 0x37, 0x3A, 0xEC, 0x1E, 0x97, 0xC9, 0xA0, 0x0D,
63 0x05, 0xB4, 0x41, 0x6D, 0x7C, 0x1B, 0xDE, 0x26, 0x05,
64 0xA2, 0x97, 0xE7, 0x74, 0xD0, 0x06, 0xB8, 0xDA, 0xF4,
65 0x40, 0x1B, 0x0A, 0x88, 0x5E, 0x9E, 0xD3, 0x01,
66};
67
68static const char enhancedV2_text[] = "enhanced ^ {][} test |+~ ^ tests";
69#define enhancedV2_septet_length 40 /* note: number of octets are equal to the enhanced_text! */
70static const uint8_t enhancedV2_enc[] = {
71 0x65, 0x37, 0x3A, 0xEC, 0x1E, 0x97, 0xC9, 0xA0, 0x0D,
72 0x05, 0xB4, 0x41, 0x6D, 0x7C, 0x1B, 0xDE, 0x26, 0x05,
73 0xA2, 0x97, 0xE7, 0x74, 0xD0, 0x06, 0xB8, 0xDA, 0xF4,
74 0x40, 0x1B, 0x0A, 0x88, 0x5E, 0x9E, 0xD3, 0xE7,
75};
76
77
78
79static const char concatenated_text[] =
80 "this is a testmessage. this is a testmessage. this is a testmessage. this is a testmessage. "
81 "this is a testmessage. this is a testmessage. cut here .....: this is a second testmessage. end here.";
82
83static const char splitted_text_part1[] =
84 "this is a testmessage. this is a testmessage. this is a testmessage. this is a testmessage. "
85 "this is a testmessage. this is a testmessage. cut here .....:";
86#define concatenated_part1_septet_length_with_header 160
87#define concatenated_part1_septet_length 153
88static const uint8_t concatenated_part1_enc[] = {
89 0x05, 0x00, 0x03, 0x6f, 0x02, 0x01,
90 0xe8, 0xe8, 0xf4, 0x1c, 0x94, 0x9e, 0x83, 0xc2,
91 0x20, 0x7a, 0x79, 0x4e, 0x6f, 0x97, 0xe7, 0xf3,
92 0xf0, 0xb9, 0xec, 0x02, 0xd1, 0xd1, 0xe9, 0x39,
93 0x28, 0x3d, 0x07, 0x85, 0x41, 0xf4, 0xf2, 0x9c,
94 0xde, 0x2e, 0xcf, 0xe7, 0xe1, 0x73, 0xd9, 0x05,
95 0xa2, 0xa3, 0xd3, 0x73, 0x50, 0x7a, 0x0e, 0x0a,
96 0x83, 0xe8, 0xe5, 0x39, 0xbd, 0x5d, 0x9e, 0xcf,
97 0xc3, 0xe7, 0xb2, 0x0b, 0x44, 0x47, 0xa7, 0xe7,
98 0xa0, 0xf4, 0x1c, 0x14, 0x06, 0xd1, 0xcb, 0x73,
99 0x7a, 0xbb, 0x3c, 0x9f, 0x87, 0xcf, 0x65, 0x17,
100 0x88, 0x8e, 0x4e, 0xcf, 0x41, 0xe9, 0x39, 0x28,
101 0x0c, 0xa2, 0x97, 0xe7, 0xf4, 0x76, 0x79, 0x3e,
102 0x0f, 0x9f, 0xcb, 0x2e, 0x10, 0x1d, 0x9d, 0x9e,
103 0x83, 0xd2, 0x73, 0x50, 0x18, 0x44, 0x2f, 0xcf,
104 0xe9, 0xed, 0xf2, 0x7c, 0x1e, 0x3e, 0x97, 0x5d,
105 0xa0, 0x71, 0x9d, 0x0e, 0x42, 0x97, 0xe5, 0x65,
106 0x90, 0xcb, 0xe5, 0x72, 0xb9, 0x74,
107};
108
109static const char splitted_text_part2[] = " this is a second testmessage. end here.";
110#define concatenated_part2_septet_length_with_header 47
111#define concatenated_part2_septet_length 40
112static const uint8_t concatenated_part2_enc[] = {
113 0x05, 0x00, 0x03, 0x6f, 0x02, 0x02,
114 0x40, 0x74, 0x74, 0x7a, 0x0e, 0x4a, 0xcf, 0x41,
115 0x61, 0xd0, 0xbc, 0x3c, 0x7e, 0xbb, 0xc9, 0x20,
116 0x7a, 0x79, 0x4e, 0x6f, 0x97, 0xe7, 0xf3, 0xf0,
117 0xb9, 0xec, 0x02, 0x95, 0xdd, 0x64, 0x10, 0xba,
118 0x2c, 0x2f, 0xbb, 0x00,
119};
120
121static const struct test_case test_multiple_encode[] =
122{
123 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200124 .input = (const uint8_t *) concatenated_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200125 .expected = concatenated_part1_enc,
126 .expected_octet_length = sizeof(concatenated_part1_enc),
127 .expected_septet_length = concatenated_part1_septet_length,
128 .ud_hdr_ind = 1,
129 },
130 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200131 .input = (const uint8_t *) concatenated_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200132 .expected = concatenated_part2_enc,
133 .expected_octet_length = sizeof(concatenated_part2_enc),
134 .expected_septet_length = concatenated_part2_septet_length,
135 .ud_hdr_ind = 1,
136 },
137};
138
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800139static const struct test_case test_encode[] =
140{
141 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200142 .input = (const uint8_t *) simple_text,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800143 .expected = simple_enc,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200144 .expected_octet_length = sizeof(simple_enc),
145 .expected_septet_length = simple_septet_length,
146 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800147 },
148 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200149 .input = (const uint8_t *) escape_text,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800150 .expected = escape_enc,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200151 .expected_octet_length = sizeof(escape_enc),
152 .expected_septet_length = escape_septet_length,
153 .ud_hdr_ind = 0,
154 },
155 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200156 .input = (const uint8_t *) enhanced_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200157 .expected = enhanced_enc,
158 .expected_octet_length = sizeof(enhanced_enc),
159 .expected_septet_length = enhanced_septet_length,
160 .ud_hdr_ind = 0,
161 },
162 {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200163 .input = (const uint8_t *) enhancedV2_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200164 .expected = enhancedV2_enc,
165 .expected_octet_length = sizeof(enhancedV2_enc),
166 .expected_septet_length = enhancedV2_septet_length,
167 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800168 },
169};
170
171static const struct test_case test_decode[] =
172{
173 {
174 .input = simple_enc,
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200175 .input_length = sizeof(simple_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200176 .expected = (const uint8_t *) simple_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200177 .expected_septet_length = simple_septet_length,
178 .ud_hdr_ind = 0,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800179 },
180 {
181 .input = escape_enc,
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200182 .input_length = sizeof(escape_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200183 .expected = (const uint8_t *) escape_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200184 .expected_septet_length = escape_septet_length,
185 .ud_hdr_ind = 0,
186 },
187 {
188 .input = enhanced_enc,
189 .input_length = sizeof(enhanced_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200190 .expected = (const uint8_t *) enhanced_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200191 .expected_septet_length = enhanced_septet_length,
192 .ud_hdr_ind = 0,
193 },
194 {
195 .input = enhancedV2_enc,
196 .input_length = sizeof(enhancedV2_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200197 .expected = (const uint8_t *) enhancedV2_text,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200198 .expected_septet_length = enhancedV2_septet_length,
199 .ud_hdr_ind = 0,
200 },
201 {
202 .input = concatenated_part1_enc,
203 .input_length = sizeof(concatenated_part1_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200204 .expected = (const uint8_t *) splitted_text_part1,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200205 .expected_septet_length = concatenated_part1_septet_length_with_header,
206 .ud_hdr_ind = 1,
207 },
208 {
209 .input = concatenated_part2_enc,
210 .input_length = sizeof(concatenated_part2_enc),
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200211 .expected = (const uint8_t *) splitted_text_part2,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200212 .expected_septet_length = concatenated_part2_septet_length_with_header,
213 .ud_hdr_ind = 1,
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800214 },
215};
Harald Welteec8b4502010-02-20 20:34:29 +0100216
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200217static void test_octet_return()
218{
219 char out[256];
220 int oct, septets;
221
222 printf("Encoding some tests and printing number of septets/octets\n");
223
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200224 septets = gsm_7bit_encode_n((uint8_t *) out, sizeof(out), "test1234", &oct);
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200225 printf("SEPTETS: %d OCTETS: %d\n", septets, oct);
226
227 printf("Done\n");
228}
229
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +0200230static void test_gen_oa(void)
231{
232 uint8_t oa[12];
233 int len;
234
235 printf("Testing gsm340_gen_oa\n");
236
237 /* first try... */
238 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_UNKNOWN,
239 GSM340_PLAN_ISDN, "12345678901234567891");
240 OSMO_ASSERT(len == 12);
241 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
242 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_NATIONAL,
243 GSM340_PLAN_ISDN, "12345678901234567891");
244 OSMO_ASSERT(len == 12);
245 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
246
247 /* long input.. will fail and just prints the header*/
248 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_INTERNATIONAL,
249 GSM340_PLAN_ISDN, "123456789123456789120");
250 OSMO_ASSERT(len == 2);
251 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
252
253 /* try the alpha numeric encoding */
254 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_ALPHA_NUMERIC,
255 GSM340_PLAN_UNKNOWN, "OpenBSC");
256 OSMO_ASSERT(len == 9);
257 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
258
259 /* long alpha numeric text */
260 len = gsm340_gen_oa(oa, ARRAY_SIZE(oa), GSM340_TYPE_ALPHA_NUMERIC,
261 GSM340_PLAN_UNKNOWN, "OpenBSCabcdefghijklm");
262 OSMO_ASSERT(len == 12);
263 printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len));
264}
265
Harald Welteec8b4502010-02-20 20:34:29 +0100266int main(int argc, char** argv)
267{
268 printf("SMS testing\n");
Harald Welteec8b4502010-02-20 20:34:29 +0100269 uint8_t i;
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200270 uint16_t buffer_size;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200271 uint8_t octet_length;
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200272 int octets_written;
273 uint8_t computed_octet_length;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200274 uint8_t septet_length;
Harald Welteec8b4502010-02-20 20:34:29 +0100275 uint8_t coded[256];
Dennis Wehrle291e6132011-07-24 20:14:13 +0200276 uint8_t tmp[160];
277 uint8_t septet_data[256];
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200278 int nchars;
Harald Welteec8b4502010-02-20 20:34:29 +0100279 char result[256];
280
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800281 /* test 7-bit encoding */
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200282 for (i = 0; i < ARRAY_SIZE(test_encode); ++i) {
Jacob Erlbeck26cbd452014-01-07 13:39:24 +0100283 /* Test legacy function (return value only) */
284 septet_length = gsm_7bit_encode(coded,
285 (const char *) test_encode[i].input);
286 printf("Legacy encode case %d: "
287 "septet length %d (expected %d)\n"
288 , i
289 , septet_length, test_encode[i].expected_septet_length
290 );
291 OSMO_ASSERT (septet_length == test_encode[i].expected_septet_length);
292
293 /* Test new function */
Nico Goldec0ce9aa2010-07-20 15:43:58 +0200294 memset(coded, 0x42, sizeof(coded));
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200295 septet_length = gsm_7bit_encode_n(coded, sizeof(coded),
296 (const char *) test_encode[i].input,
297 &octets_written);
298 computed_octet_length = gsm_get_octet_len(septet_length);
299 printf("Encode case %d: "
300 "Octet length %d (expected %d, computed %d), "
301 "septet length %d (expected %d)\n"
302 , i
303 , octets_written, test_encode[i].expected_octet_length, computed_octet_length
304 , septet_length, test_encode[i].expected_septet_length
305 );
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800306
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200307 OSMO_ASSERT (octets_written == test_encode[i].expected_octet_length);
308 OSMO_ASSERT (octets_written == computed_octet_length);
309 OSMO_ASSERT (memcmp(coded, test_encode[i].expected, octets_written) == 0);
Jacob Erlbeck26cbd452014-01-07 13:39:24 +0100310 OSMO_ASSERT (septet_length == test_encode[i].expected_septet_length);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200311
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200312 /* check buffer limiting */
313 memset(coded, 0xaa, sizeof(coded));
314
315 for (buffer_size = 0;
316 buffer_size < test_encode[i].expected_octet_length + 1
317 && buffer_size < sizeof(coded) - 1;
318 ++buffer_size)
319 {
320 gsm_7bit_encode_n(coded, buffer_size,
321 (const char *) test_encode[i].input,
322 &octets_written);
323
324 OSMO_ASSERT(octets_written <= buffer_size);
325 OSMO_ASSERT(coded[buffer_size] == 0xaa);
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800326 }
Harald Welteec8b4502010-02-20 20:34:29 +0100327 }
Nico Golde28de0532010-07-09 17:19:12 +0200328
Dennis Wehrle291e6132011-07-24 20:14:13 +0200329
330 /* Test: encode multiple SMS */
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200331 int number_of_septets = gsm_septet_encode(septet_data, (const char *) test_multiple_encode[0].input);
Jacob Erlbeck73ae7a92013-10-08 12:04:42 +0200332 (void) number_of_septets;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200333
334 /* SMS part 1 */
335 memset(tmp, 0x42, sizeof(tmp));
336 memset(coded, 0x42, sizeof(coded));
337 memcpy(tmp, septet_data, concatenated_part1_septet_length);
338
339 /* In our case: test_multiple_decode[0].ud_hdr_ind equals number of padding bits*/
340 octet_length = gsm_septets2octets(coded, tmp, concatenated_part1_septet_length, test_multiple_encode[0].ud_hdr_ind);
341
342 /* copy header */
343 memset(tmp, 0x42, sizeof(tmp));
344 int udh_length = test_multiple_encode[0].expected[0] + 1;
345 memcpy(tmp, test_multiple_encode[0].expected, udh_length);
346 memcpy(tmp + udh_length, coded, octet_length);
347 memset(coded, 0x42, sizeof(coded));
348 memcpy(coded, tmp, octet_length + 6);
349
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200350 OSMO_ASSERT(memcmp(coded, test_multiple_encode[0].expected, octet_length) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200351
352 /* SMS part 2 */
353 memset(tmp, 0x42, sizeof(tmp));
354 memset(coded, 0x42, sizeof(coded));
355 memcpy(tmp, septet_data + concatenated_part1_septet_length, concatenated_part2_septet_length);
356
357 /* In our case: test_multiple_decode[1].ud_hdr_ind equals number of padding bits*/
358 octet_length = gsm_septets2octets(coded, tmp, concatenated_part2_septet_length, test_multiple_encode[1].ud_hdr_ind);
359
360 /* copy header */
361 memset(tmp, 0x42, sizeof(tmp));
362 udh_length = test_multiple_encode[1].expected[0] + 1;
363 memcpy(tmp, test_multiple_encode[1].expected, udh_length);
364 memcpy(tmp + udh_length, coded, octet_length);
365 memset(coded, 0x42, sizeof(coded));
366 memcpy(coded, tmp, octet_length + 6);
367
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200368 OSMO_ASSERT(memcmp(coded, test_multiple_encode[1].expected, octet_length) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200369
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800370 /* test 7-bit decoding */
371 for (i = 0; i < ARRAY_SIZE(test_decode); ++i) {
Jacob Erlbeck26cbd452014-01-07 13:39:24 +0100372 /* Test legacy function (return value only) */
373 if (!test_decode[i].ud_hdr_ind) {
374 nchars = gsm_7bit_decode(result, test_decode[i].input,
375 test_decode[i].expected_septet_length);
376 printf("Legacy decode case %d: "
377 "return value %d (expected %d)\n",
378 i, nchars, test_decode[i].expected_septet_length);
379 }
380
381 /* Test new function */
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200382 memset(result, 0x42, sizeof(result));
383 nchars = gsm_7bit_decode_n_hdr(result, sizeof(result), test_decode[i].input,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200384 test_decode[i].expected_septet_length, test_decode[i].ud_hdr_ind);
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200385 printf("Decode case %d: return value %d (expected %d)\n", i, nchars, strlen(result));
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800386
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200387 OSMO_ASSERT(strcmp(result, (const char *) test_decode[i].expected) == 0);
388 OSMO_ASSERT(nchars == strlen(result));
389
390 /* check buffer limiting */
391 memset(result, 0xaa, sizeof(result));
392
393 for (buffer_size = 1;
Holger Hans Peter Freytherbb9f8972013-10-08 13:57:51 +0200394 buffer_size < test_decode[i].expected_septet_length + 1
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200395 && buffer_size < sizeof(result) - 1;
396 ++buffer_size)
397 {
398 nchars = gsm_7bit_decode_n_hdr(result, buffer_size, test_decode[i].input,
399 test_decode[i].expected_septet_length, test_decode[i].ud_hdr_ind);
400
401 OSMO_ASSERT(nchars <= buffer_size);
402 OSMO_ASSERT(result[buffer_size] == (char)0xaa);
403 OSMO_ASSERT(result[nchars] == '\0');
Dennis Wehrle291e6132011-07-24 20:14:13 +0200404 }
Nico Golde28de0532010-07-09 17:19:12 +0200405 }
406
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200407 test_octet_return();
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +0200408 test_gen_oa();
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200409
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800410 printf("OK\n");
Nico Golde28de0532010-07-09 17:19:12 +0200411 return 0;
Harald Welteec8b4502010-02-20 20:34:29 +0100412}