blob: d7b38b6af63831a7018bb9dae590a76dbd35cddd [file] [log] [blame]
Lev Walkin4eceeba2007-07-23 06:48:26 +00001#include <stdio.h>
2#include <assert.h>
3
4#include <INTEGER.h>
Lev Walkinf15320b2004-06-03 03:38:44 +00005
Lev Walkindb13f512004-07-19 17:30:25 +00006static char *shared_scratch_start;
7
8static int _print2buf(const void *buf, size_t size, void *key) {
9 (void)key;
10 memcpy(shared_scratch_start, buf, size);
11 shared_scratch_start += size;
12 *shared_scratch_start = '\0'; /* 0-termination */
13 return 0;
14}
15
Lev Walkinf15320b2004-06-03 03:38:44 +000016static void
Lev Walkin494fb702017-08-07 20:07:00 -070017check(uint8_t *buf, size_t size, long check_long, int check_ret) {
Lev Walkindb13f512004-07-19 17:30:25 +000018 char scratch[128];
19 char verify[32];
Lev Walkinf15320b2004-06-03 03:38:44 +000020 INTEGER_t val;
Lev Walkindb13f512004-07-19 17:30:25 +000021 uint8_t *buf_end = buf + size;
Lev Walkinf15320b2004-06-03 03:38:44 +000022 int ret;
23 long rlong = 123;
24
25 assert(buf);
26 assert(size >= 0);
27
28 val.buf = buf;
29 val.size = size;
30
Lev Walkindb13f512004-07-19 17:30:25 +000031 printf("Testing: [");
32 for(; buf < buf_end; buf++) {
33 if(buf != val.buf) printf(":");
34 printf("%02x", *buf);
35 }
36 printf("]: ");
Lev Walkinf15320b2004-06-03 03:38:44 +000037
Lev Walkin5e033762004-09-29 13:26:15 +000038 ret = asn_INTEGER2long(&val, &rlong);
Lev Walkindb13f512004-07-19 17:30:25 +000039 printf(" (%ld, %d) vs (%ld, %d)\n",
Lev Walkinf15320b2004-06-03 03:38:44 +000040 rlong, ret, check_long, check_ret);
41 assert(ret == check_ret);
Lev Walkin33700162004-10-26 09:03:31 +000042 printf("%ld %ld\n", rlong, check_long);
Lev Walkinf15320b2004-06-03 03:38:44 +000043 assert(rlong == check_long);
Lev Walkindb13f512004-07-19 17:30:25 +000044
Lev Walkinc698ee52004-10-21 11:19:51 +000045 if(check_ret == 0) {
46 INTEGER_t val2;
47 long rlong2;
48 val2.buf = 0;
49 val2.size = 0;
50 ret = asn_long2INTEGER(&val2, rlong);
51 assert(ret == 0);
52 assert(val2.buf);
53 assert(val2.size <= val.size); /* At least as compact */
54 ret = asn_INTEGER2long(&val, &rlong2);
55 assert(ret == 0);
56 assert(rlong == rlong2);
Lev Walkin229ad002017-09-18 20:13:49 -070057 ASN_STRUCT_RESET(asn_DEF_INTEGER, &val2);
Lev Walkinc698ee52004-10-21 11:19:51 +000058 }
59
Lev Walkindb13f512004-07-19 17:30:25 +000060 shared_scratch_start = scratch;
Lev Walkin5e033762004-09-29 13:26:15 +000061 ret = INTEGER_print(&asn_DEF_INTEGER, &val, 0, _print2buf, scratch);
Lev Walkindb13f512004-07-19 17:30:25 +000062 assert(shared_scratch_start < scratch + sizeof(scratch));
63 assert(ret == 0);
64 ret = snprintf(verify, sizeof(verify), "%ld", check_long);
Lev Walkin97363482016-01-24 19:23:02 -080065 assert(ret < 0 || (size_t)ret < sizeof(verify));
Lev Walkindb13f512004-07-19 17:30:25 +000066 ret = strcmp(scratch, verify);
67 printf(" [%s] vs [%s]: %d%s\n",
68 scratch, verify, ret,
69 (check_ret == -1)?" (expected to fail)":""
70 );
71 if(check_ret == -1) {
72 assert(strcmp(scratch, verify));
73 } else {
74 assert(strcmp(scratch, verify) == 0);
75 }
Lev Walkinf15320b2004-06-03 03:38:44 +000076}
77
Lev Walkin0be3a992004-10-21 12:11:57 +000078static void
Lev Walkin5c879db2007-11-06 06:23:31 +000079check_unsigned(uint8_t *buf, int size, unsigned long check_long, int check_ret) {
80 char scratch[128];
81 char verify[32];
82 INTEGER_t val;
83 uint8_t *buf_end = buf + size;
84 int ret;
85 unsigned long rlong = 123;
86
87 assert(buf);
88 assert(size >= 0);
89
90 val.buf = buf;
91 val.size = size;
92
93 printf("Testing: [");
94 for(; buf < buf_end; buf++) {
95 if(buf != val.buf) printf(":");
96 printf("%02x", *buf);
97 }
98 printf("]: ");
99
100 ret = asn_INTEGER2ulong(&val, &rlong);
101 printf(" (%lu, %d) vs (%lu, %d)\n",
102 rlong, ret, check_long, check_ret);
103 assert(ret == check_ret);
Lev Walkin5c879db2007-11-06 06:23:31 +0000104 assert(rlong == check_long);
105
106 if(check_ret == 0) {
107 INTEGER_t val2;
108 unsigned long rlong2;
109 val2.buf = 0;
110 val2.size = 0;
111 ret = asn_ulong2INTEGER(&val2, rlong);
112 assert(ret == 0);
113 assert(val2.buf);
114 if(val2.size > val.size) {
115 /* At least as compact */
116 printf("val2.size=%d, val.size=%d\n",
117 (int)val2.size, (int)val.size);
118 assert(val2.size <= val.size);
119 }
120 ret = asn_INTEGER2ulong(&val, &rlong2);
121 assert(ret == 0);
122 assert(rlong == rlong2);
Lev Walkin229ad002017-09-18 20:13:49 -0700123 ASN_STRUCT_RESET(asn_DEF_INTEGER, &val2);
Lev Walkin5c879db2007-11-06 06:23:31 +0000124 }
125
Lev Walkin97f8edc2013-03-28 04:38:41 -0700126 return;
127
Lev Walkin5c879db2007-11-06 06:23:31 +0000128 shared_scratch_start = scratch;
129 ret = INTEGER_print(&asn_DEF_INTEGER, &val, 0, _print2buf, scratch);
130 assert(shared_scratch_start < scratch + sizeof(scratch));
131 assert(ret == 0);
Lev Walkin043babe2012-01-22 18:06:59 -0800132 ret = snprintf(verify, sizeof(verify), "%lu", check_long);
Lev Walkin5c879db2007-11-06 06:23:31 +0000133 assert(ret < sizeof(verify));
134 ret = strcmp(scratch, verify);
135 printf(" [%s] vs [%s]: %d%s\n",
136 scratch, verify, ret,
137 (check_ret == -1)?" (expected to fail)":""
138 );
139 if(check_ret == -1) {
140 assert(strcmp(scratch, verify));
141 } else {
142 assert(strcmp(scratch, verify) == 0);
143 }
144}
145
146static void
Lev Walkin0be3a992004-10-21 12:11:57 +0000147check_xer(int tofail, char *xmldata, long orig_value) {
148 INTEGER_t *st = 0;
149 asn_dec_rval_t rc;
150 long value;
151 int ret;
152
Lev Walkinbe03a2f2004-10-21 12:23:41 +0000153 printf("[%s] vs %ld: ", xmldata, orig_value);
Lev Walkin0be3a992004-10-21 12:11:57 +0000154
155 rc = xer_decode(0, &asn_DEF_INTEGER, (void *)&st,
156 xmldata, strlen(xmldata));
157 if(rc.code != RC_OK) {
158 assert(tofail);
159 printf("\tfailed, as expected\n");
Lev Walkin229ad002017-09-18 20:13:49 -0700160 ASN_STRUCT_FREE(asn_DEF_INTEGER, st);
Lev Walkin0be3a992004-10-21 12:11:57 +0000161 return;
162 }
163 assert(!tofail);
164
165 ret = asn_INTEGER2long(st, &value);
166 assert(ret == 0);
167
168 printf("\t%ld\n", value);
169
170 assert(value == orig_value);
171
Bi-Ruei, Chiu1f87ac02017-08-20 01:25:45 +0800172 ASN_STRUCT_FREE(asn_DEF_INTEGER, st);
Lev Walkin0be3a992004-10-21 12:11:57 +0000173}
174
Lev Walkinf15320b2004-06-03 03:38:44 +0000175int
Lev Walkin97363482016-01-24 19:23:02 -0800176main() {
Lev Walkinf15320b2004-06-03 03:38:44 +0000177 uint8_t buf1[] = { 1 };
178 uint8_t buf2[] = { 0xff };
179 uint8_t buf3[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
180 uint8_t buf4[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0 };
181 uint8_t buf5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 };
182 uint8_t buf6[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
183 uint8_t buf7[] = { 0xff, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
184 uint8_t buf8[] = { 0x7f, 0x7e, 0x7d, 0x7c };
185 uint8_t buf9[] = { 0, 0x7f, 0x7e, 0x7d, 0x7c };
186 uint8_t buf10[] = { 0, 0, 0, 0, 0, 0, 0x7f, 0x7e, 0x7d, 0x7c };
Lev Walkinc698ee52004-10-21 11:19:51 +0000187 uint8_t buf11[] = { 0x80, 0, 0, 0 };
188 uint8_t buf12[] = { 0x80, 0 };
189 uint8_t buf13[] = { 0x80 };
Lev Walkin5c879db2007-11-06 06:23:31 +0000190 uint8_t buf14[] = { 0x00, 0x80, 0x00, 0x00 };
191 uint8_t buf15[] = { 0x00, 0x80, 0x00, 0x00, 0x00 };
192 uint8_t buf16[] = { 0x00, 0xff, 0xff, 0x00, 0x00 };
193
194#define UCHECK(buf, val, ret) check_unsigned(buf, sizeof(buf), val, ret)
Lev Walkinf15320b2004-06-03 03:38:44 +0000195
196#define CHECK(buf, val, ret) check(buf, sizeof(buf), val, ret)
197
198 CHECK(buf1, 1, 0);
199 CHECK(buf2, -1, 0);
200 CHECK(buf3, -1, 0);
201 CHECK(buf4, -16, 0);
202 CHECK(buf5, 257, 0);
203 CHECK(buf6, 123, -1);
204 CHECK(buf7, 123, -1);
205 CHECK(buf8, 0x7F7E7D7C, 0);
206 CHECK(buf9, 0x7F7E7D7C, 0);
207 CHECK(buf10, 0x7F7E7D7C, 0);
Lev Walkin5c879db2007-11-06 06:23:31 +0000208 UCHECK(buf10, 0x7F7E7D7C, 0);
Lev Walkin3f36e462005-08-15 01:02:47 +0000209 CHECK(buf11, -2147483647-1, 0); /* 0x80000000 */
Lev Walkinc698ee52004-10-21 11:19:51 +0000210 CHECK(buf12, -32768, 0);
211 CHECK(buf13, -128, 0);
Lev Walkin5c879db2007-11-06 06:23:31 +0000212 UCHECK(buf14, 0x800000, 0);
Lev Walkin043babe2012-01-22 18:06:59 -0800213 UCHECK(buf15, 0x80000000UL, 0);
214 UCHECK(buf16, 0xffff0000UL, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +0000215
Lev Walkin0be3a992004-10-21 12:11:57 +0000216 check_xer(-1, "", 0);
217 check_xer(-1, "<INTEGER></INTEGER>", 0);
Lev Walkinbe03a2f2004-10-21 12:23:41 +0000218 check_xer(-1, "<INTEGER> </INTEGER>", 0);
Lev Walkin0be3a992004-10-21 12:11:57 +0000219 check_xer(-1, "<INTEGER>-</INTEGER>", 0);
220 check_xer(-1, "<INTEGER>+</INTEGER>", 0);
221 check_xer(-1, "<INTEGER>+-</INTEGER>", 0);
Lev Walkine09f9f12012-09-02 23:06:35 -0700222 check_xer(-1, "<INTEGER> -</INTEGER>", 0);
223 check_xer(-1, "<INTEGER> +</INTEGER>", 0);
224 check_xer(-1, "<INTEGER> +-</INTEGER>", 0);
225 check_xer(-1, "<INTEGER>- </INTEGER>", 0);
226 check_xer(-1, "<INTEGER>+ </INTEGER>", 0);
227 check_xer(-1, "<INTEGER>+- </INTEGER>", 0);
228 check_xer(-1, "<INTEGER> - </INTEGER>", 0);
229 check_xer(-1, "<INTEGER> + </INTEGER>", 0);
230 check_xer(-1, "<INTEGER> +- </INTEGER>", 0);
Lev Walkin0be3a992004-10-21 12:11:57 +0000231 check_xer(0, "<INTEGER>+0</INTEGER>", 0);
232 check_xer(0, "<INTEGER>-0</INTEGER>", 0);
233 check_xer(0, "<INTEGER>+1</INTEGER>", 1);
234 check_xer(0, "<INTEGER>-1</INTEGER>", -1);
235 check_xer(0, "<INTEGER>1</INTEGER>", 1);
236 check_xer(0, "<INTEGER>-15</INTEGER>", -15);
237 check_xer(0, "<INTEGER>+15</INTEGER>", 15);
238 check_xer(0, "<INTEGER>15</INTEGER>", 15);
239 check_xer(0, "<INTEGER> 15</INTEGER>", 15);
240 check_xer(0, "<INTEGER> 15 </INTEGER>", 15);
241 check_xer(0, "<INTEGER>15 </INTEGER>", 15);
242 check_xer(0, "<INTEGER> +15 </INTEGER>", 15);
243 check_xer(-1, "<INTEGER> +15 -</INTEGER>", 0);
244 check_xer(-1, "<INTEGER> +15 1</INTEGER>", 0);
245 check_xer(-1, "<INTEGER>+ 15</INTEGER>", 0);
246 check_xer(-1, "<INTEGER>12<z>34</INTEGER>", 0);
Lev Walkine09f9f12012-09-02 23:06:35 -0700247 check_xer(-1, "<INTEGER>12 <z>34</INTEGER>", 0);
248 check_xer(-1, "<INTEGER>12 <z></INTEGER>", 0);
Lev Walkin0be3a992004-10-21 12:11:57 +0000249 check_xer(0, "<INTEGER>1234</INTEGER>", 1234);
250 check_xer(-1, "<INTEGER>1234 5678</INTEGER>", 0);
251 check_xer(0, "<INTEGER>-2147483647</INTEGER>", -2147483647);
Lev Walkin3f36e462005-08-15 01:02:47 +0000252 check_xer(0, "<INTEGER>-2147483648</INTEGER>", -2147483647-1);
Lev Walkin0be3a992004-10-21 12:11:57 +0000253 check_xer(0, "<INTEGER>+2147483647</INTEGER>", 2147483647);
254 check_xer(0, "<INTEGER>2147483647</INTEGER>", 2147483647);
Lev Walkine59f7672004-10-23 10:17:02 +0000255 if(sizeof(long) == 4) {
Lev Walkina7d1fb32012-01-23 01:21:55 +0000256 check_xer( 0, "<INTEGER>-2147483648</INTEGER>", -2147483648);
257 check_xer(-1, "<INTEGER>-2147483649</INTEGER>", 0);
Lev Walkine59f7672004-10-23 10:17:02 +0000258 check_xer(-1, "<INTEGER>2147483648</INTEGER>", 0);
259 check_xer(-1, "<INTEGER>2147483649</INTEGER>", 0);
260 check_xer(-1, "<INTEGER>3147483649</INTEGER>", 0);
261 check_xer(-1, "<INTEGER>4147483649</INTEGER>", 0);
262 check_xer(-1, "<INTEGER>5147483649</INTEGER>", 0); /* special */
263 check_xer(-1, "<INTEGER>9147483649</INTEGER>", 0);
264 check_xer(-1, "<INTEGER>9999999999</INTEGER>", 0);
Lev Walkina7d1fb32012-01-23 01:21:55 +0000265 check_xer(-1, "<INTEGER>-5147483649</INTEGER>", 0);/* special */
266 check_xer(-1, "<INTEGER>-9147483649</INTEGER>", 0);
267 check_xer(-1, "<INTEGER>-9999999999</INTEGER>", 0);
268 }
269 if(sizeof(long) == 8) {
270 check_xer(0, "<INTEGER>2147483648</INTEGER>", 2147483648);
271 check_xer(0, "<INTEGER>2147483649</INTEGER>", 2147483649);
272 check_xer(0, "<INTEGER>3147483649</INTEGER>", 3147483649);
273 check_xer(0, "<INTEGER>4147483649</INTEGER>", 4147483649);
274 check_xer(0, "<INTEGER>5147483649</INTEGER>", 5147483649);
275 check_xer(0, "<INTEGER>9147483649</INTEGER>", 9147483649);
276 check_xer(0, "<INTEGER>9999999999</INTEGER>", 9999999999);
277 check_xer(0, "<INTEGER>9223372036854775807</INTEGER>", 9223372036854775807);
278 check_xer(-1, "<INTEGER>9223372036854775808</INTEGER>", 0);
279 check_xer(-1, "<INTEGER>10223372036854775807</INTEGER>", 0);
280 check_xer(-1, "<INTEGER>50223372036854775807</INTEGER>", 0);
281 check_xer(-1, "<INTEGER>100223372036854775807</INTEGER>", 0);
282 check_xer(-1, "<INTEGER>500223372036854775807</INTEGER>", 0);
Lev Walkin97363482016-01-24 19:23:02 -0800283 check_xer(0, "<INTEGER>-9223372036854775808</INTEGER>", -9223372036854775807-1);
Lev Walkina7d1fb32012-01-23 01:21:55 +0000284 check_xer(-1, "<INTEGER>-9223372036854775809</INTEGER>", 0);
285 check_xer(-1, "<INTEGER>-10223372036854775807</INTEGER>", 0);
286 check_xer(-1, "<INTEGER>-50223372036854775807</INTEGER>", 0);
287 check_xer(-1, "<INTEGER>-100223372036854775807</INTEGER>", 0);
288 check_xer(-1, "<INTEGER>-500223372036854775807</INTEGER>", 0);
Lev Walkine59f7672004-10-23 10:17:02 +0000289 }
Lev Walkin0be3a992004-10-21 12:11:57 +0000290
Lev Walkinf15320b2004-06-03 03:38:44 +0000291 return 0;
292}