blob: 2c9d8d8b54b08c38214089ed12622ebaea5c46c1 [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) {
283 memset(coded, 0x42, sizeof(coded));
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200284 septet_length = gsm_7bit_encode_n(coded, sizeof(coded),
285 (const char *) test_encode[i].input,
286 &octets_written);
287 computed_octet_length = gsm_get_octet_len(septet_length);
288 printf("Encode case %d: "
289 "Octet length %d (expected %d, computed %d), "
290 "septet length %d (expected %d)\n"
291 , i
292 , octets_written, test_encode[i].expected_octet_length, computed_octet_length
293 , septet_length, test_encode[i].expected_septet_length
294 );
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800295
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200296 OSMO_ASSERT (octets_written == test_encode[i].expected_octet_length);
297 OSMO_ASSERT (octets_written == computed_octet_length);
298 OSMO_ASSERT (memcmp(coded, test_encode[i].expected, octets_written) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200299
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200300 /* check buffer limiting */
301 memset(coded, 0xaa, sizeof(coded));
302
303 for (buffer_size = 0;
304 buffer_size < test_encode[i].expected_octet_length + 1
305 && buffer_size < sizeof(coded) - 1;
306 ++buffer_size)
307 {
308 gsm_7bit_encode_n(coded, buffer_size,
309 (const char *) test_encode[i].input,
310 &octets_written);
311
312 OSMO_ASSERT(octets_written <= buffer_size);
313 OSMO_ASSERT(coded[buffer_size] == 0xaa);
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800314 }
Harald Welteec8b4502010-02-20 20:34:29 +0100315 }
Nico Golde28de0532010-07-09 17:19:12 +0200316
Dennis Wehrle291e6132011-07-24 20:14:13 +0200317
318 /* Test: encode multiple SMS */
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200319 int number_of_septets = gsm_septet_encode(septet_data, (const char *) test_multiple_encode[0].input);
Jacob Erlbeck73ae7a92013-10-08 12:04:42 +0200320 (void) number_of_septets;
Dennis Wehrle291e6132011-07-24 20:14:13 +0200321
322 /* SMS part 1 */
323 memset(tmp, 0x42, sizeof(tmp));
324 memset(coded, 0x42, sizeof(coded));
325 memcpy(tmp, septet_data, concatenated_part1_septet_length);
326
327 /* In our case: test_multiple_decode[0].ud_hdr_ind equals number of padding bits*/
328 octet_length = gsm_septets2octets(coded, tmp, concatenated_part1_septet_length, test_multiple_encode[0].ud_hdr_ind);
329
330 /* copy header */
331 memset(tmp, 0x42, sizeof(tmp));
332 int udh_length = test_multiple_encode[0].expected[0] + 1;
333 memcpy(tmp, test_multiple_encode[0].expected, udh_length);
334 memcpy(tmp + udh_length, coded, octet_length);
335 memset(coded, 0x42, sizeof(coded));
336 memcpy(coded, tmp, octet_length + 6);
337
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200338 OSMO_ASSERT(memcmp(coded, test_multiple_encode[0].expected, octet_length) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200339
340 /* SMS part 2 */
341 memset(tmp, 0x42, sizeof(tmp));
342 memset(coded, 0x42, sizeof(coded));
343 memcpy(tmp, septet_data + concatenated_part1_septet_length, concatenated_part2_septet_length);
344
345 /* In our case: test_multiple_decode[1].ud_hdr_ind equals number of padding bits*/
346 octet_length = gsm_septets2octets(coded, tmp, concatenated_part2_septet_length, test_multiple_encode[1].ud_hdr_ind);
347
348 /* copy header */
349 memset(tmp, 0x42, sizeof(tmp));
350 udh_length = test_multiple_encode[1].expected[0] + 1;
351 memcpy(tmp, test_multiple_encode[1].expected, udh_length);
352 memcpy(tmp + udh_length, coded, octet_length);
353 memset(coded, 0x42, sizeof(coded));
354 memcpy(coded, tmp, octet_length + 6);
355
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200356 OSMO_ASSERT(memcmp(coded, test_multiple_encode[1].expected, octet_length) == 0);
Dennis Wehrle291e6132011-07-24 20:14:13 +0200357
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800358 /* test 7-bit decoding */
359 for (i = 0; i < ARRAY_SIZE(test_decode); ++i) {
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200360 memset(result, 0x42, sizeof(result));
361 nchars = gsm_7bit_decode_n_hdr(result, sizeof(result), test_decode[i].input,
Dennis Wehrle291e6132011-07-24 20:14:13 +0200362 test_decode[i].expected_septet_length, test_decode[i].ud_hdr_ind);
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200363 printf("Decode case %d: return value %d (expected %d)\n", i, nchars, strlen(result));
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800364
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200365 OSMO_ASSERT(strcmp(result, (const char *) test_decode[i].expected) == 0);
366 OSMO_ASSERT(nchars == strlen(result));
367
368 /* check buffer limiting */
369 memset(result, 0xaa, sizeof(result));
370
371 for (buffer_size = 1;
Holger Hans Peter Freytherbb9f8972013-10-08 13:57:51 +0200372 buffer_size < test_decode[i].expected_septet_length + 1
Jacob Erlbeck1d7f3b52013-08-12 17:07:53 +0200373 && buffer_size < sizeof(result) - 1;
374 ++buffer_size)
375 {
376 nchars = gsm_7bit_decode_n_hdr(result, buffer_size, test_decode[i].input,
377 test_decode[i].expected_septet_length, test_decode[i].ud_hdr_ind);
378
379 OSMO_ASSERT(nchars <= buffer_size);
380 OSMO_ASSERT(result[buffer_size] == (char)0xaa);
381 OSMO_ASSERT(result[nchars] == '\0');
Dennis Wehrle291e6132011-07-24 20:14:13 +0200382 }
Nico Golde28de0532010-07-09 17:19:12 +0200383 }
384
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200385 test_octet_return();
Holger Hans Peter Freyther4d7e49b2013-05-02 22:37:16 +0200386 test_gen_oa();
Holger Hans Peter Freyther6bfa7442013-08-08 12:38:52 +0200387
Holger Hans Peter Freyther31e97ea2010-07-20 02:46:56 +0800388 printf("OK\n");
Nico Golde28de0532010-07-09 17:19:12 +0200389 return 0;
Harald Welteec8b4502010-02-20 20:34:29 +0100390}