blob: 314b6b3f8fb136bad9e4d46f5c89a224b9ae5a33 [file] [log] [blame]
Lev Walkined3a4ae2017-07-07 10:09:51 -07001#include <stdio.h>
2#include <assert.h>
3
Lev Walkine4d8c922017-07-10 20:29:33 -07004#include <asn_codecs.h>
Lev Walkined3a4ae2017-07-07 10:09:51 -07005#include <INTEGER.h>
Lev Walkined3a4ae2017-07-07 10:09:51 -07006
Lev Walkine4d8c922017-07-10 20:29:33 -07007#define CHECK_DECODE(code, a, b, c, d, e, f) check_decode(__LINE__, code, a, b, c, d, e, f)
Lev Walkincc9b3ae2017-07-14 08:57:02 +04008#define CHECK_ROUNDTRIP(a, b, c) check_roundtrip(__LINE__, a, b, c);
9#define CHECK_ENCODE_OK(a, b, c) check_encode(__LINE__, 0, a, b, c)
10#define CHECK_ENCODE_BAD(a, b, c) check_encode(__LINE__, 1, a, b, c);
Lev Walkin54f34512017-07-10 05:27:46 -070011
Lev Walkincc9b3ae2017-07-14 08:57:02 +040012static asn_oer_constraints_t *
Lev Walkin4118ccf2017-08-02 10:37:31 -070013setup_constraints(int lineno, const char *process, unsigned width,
14 unsigned positive) {
Lev Walkincc9b3ae2017-07-14 08:57:02 +040015 static struct asn_oer_constraints_s empty_constraints;
Lev Walkine4d8c922017-07-10 20:29:33 -070016 struct asn_oer_constraints_s *constraints = &empty_constraints;
Lev Walkin4118ccf2017-08-02 10:37:31 -070017 struct asn_oer_constraint_number_s *ct_value = &constraints->value;
Lev Walkin54f34512017-07-10 05:27:46 -070018
Lev Walkincc9b3ae2017-07-14 08:57:02 +040019 memset(&empty_constraints, 0, sizeof(empty_constraints));
20
Lev Walkine4d8c922017-07-10 20:29:33 -070021 /* Setup integer constraints as requested */
Lev Walkin4118ccf2017-08-02 10:37:31 -070022 ct_value->width = width;
23 ct_value->positive = positive;
Lev Walkine4d8c922017-07-10 20:29:33 -070024
Lev Walkincc9b3ae2017-07-14 08:57:02 +040025 return constraints;
26}
27
28static void
Lev Walkin4118ccf2017-08-02 10:37:31 -070029check_decode(int lineno, enum asn_dec_rval_code_e code, intmax_t control, const char *buf, size_t size, const char *dummy, unsigned width, unsigned positive) {
Lev Walkincc9b3ae2017-07-14 08:57:02 +040030 static char *code_s[] = { "RC_OK", "RC_WMORE", "RC_FAIL", "<error>" };
31
32 fprintf(stderr, "\n%d: OER decode (control %" PRIdMAX ")\n", lineno, control);
33
34 INTEGER_t *st = NULL;
35 asn_dec_rval_t ret;
36 asn_oer_constraints_t *constraints =
Lev Walkin4118ccf2017-08-02 10:37:31 -070037 setup_constraints(lineno, "decoding", width, positive);
Lev Walkincc9b3ae2017-07-14 08:57:02 +040038
39 fprintf(stderr, "%d: buf[%zu]={%d, %d, ...}\n", lineno, size,
40 ((const uint8_t *)buf)[0],
41 ((const uint8_t *)buf)[1]);
42
Lev Walkine4d8c922017-07-10 20:29:33 -070043 (void)dummy;
44
45 ret = asn_DEF_INTEGER.oer_decoder(0, &asn_DEF_INTEGER, constraints,
46 (void **)&st, buf, size);
Lev Walkin54f34512017-07-10 05:27:46 -070047 if(ret.code != RC_OK) {
48 /* Basic OER decode does not work */
49 fprintf(stderr, "%d: Failed oer_decode(ctl=%" PRIdMAX ", size=%zu)\n",
50 lineno, control, size);
Lev Walkine4d8c922017-07-10 20:29:33 -070051 if(ret.code == code) {
52 fprintf(stderr, " (That was expected)\n");
53 return;
54 } else {
55 fprintf(
56 stderr, " Unexpected return code %s (%d) expected %s\n",
57 code_s[(unsigned)ret.code <= RC_FAIL ? RC_FAIL : (RC_FAIL + 1)],
58 (int)ret.code, code_s[code]);
59 assert(ret.code == code);
60 }
Lev Walkin54f34512017-07-10 05:27:46 -070061 } else {
62 intmax_t outcome;
63 if(asn_INTEGER2imax(st, &outcome) != 0) {
64 /* Result of decode is structurally incorrect */
Lev Walkine4d8c922017-07-10 20:29:33 -070065 fprintf(stderr,
66 "%d: Failed to convert INTEGER 2 imax; structurally "
67 "incorrect INTEGER\n",
Lev Walkin54f34512017-07-10 05:27:46 -070068 lineno);
69 assert(!"Unreachable");
70 } else if(outcome != control) {
71 /* Decoded value is wrong */
72 fprintf(stderr,
73 "%d: Decode result %" PRIdMAX " is not expected %" PRIdMAX
74 "\n",
75 lineno, outcome, control);
76 assert(outcome == control);
77 }
78 }
79
80 fprintf(stderr, "%d: Decode result %" PRIdMAX "\n", lineno, control);
Lev Walkined3a4ae2017-07-07 10:09:51 -070081}
82
Lev Walkincc9b3ae2017-07-14 08:57:02 +040083static void
84dump_data(int lineno, const uint8_t *buf, size_t size) {
85 const uint8_t *p = buf;
86 const uint8_t *end = buf + size;
87
88 fprintf(stderr, "%d: Encoded: [", lineno);
89
90 for(; p < end; p++) {
91 fprintf(stderr, "\\x%02x", *(const unsigned char *)p);
92 }
93 fprintf(stderr, "] (%zu bytes)\n", size);
94}
Lev Walkin486fd5c2017-07-10 22:08:14 -070095
96static void
97check_roundtrip(int lineno, intmax_t value, intmax_t lower_bound, intmax_t upper_bound) {
98 uint8_t tmpbuf[32];
99 size_t tmpbuf_size;
100
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400101 fprintf(stderr, "\n%d: OER round-trip value %" PRIdMAX "\n", lineno, value);
102
Lev Walkin486fd5c2017-07-10 22:08:14 -0700103 INTEGER_t *stOut = (INTEGER_t *)calloc(1, sizeof(*stOut));
104 INTEGER_t *stIn = NULL;
105 asn_enc_rval_t er;
106 asn_dec_rval_t ret;
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400107 asn_oer_constraints_t *constraints =
108 setup_constraints(lineno, "encoding", lower_bound, upper_bound);
Lev Walkin486fd5c2017-07-10 22:08:14 -0700109
110 if(asn_imax2INTEGER(stOut, value) == -1) {
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400111 assert(!"Unreachable imax2INTEGER failure");
112 } else {
113 assert(stOut->buf != NULL);
114 assert(stOut->size != 0);
Lev Walkin486fd5c2017-07-10 22:08:14 -0700115 }
116
117 er = oer_encode_to_buffer(&asn_DEF_INTEGER, constraints, stOut, tmpbuf,
118 sizeof(tmpbuf));
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400119 if(er.encoded == -1) {
120 fprintf(stderr, "%d: OER encode failed for %s\n", lineno,
Lev Walkin486fd5c2017-07-10 22:08:14 -0700121 er.failed_type ? er.failed_type->name : "<none>");
122 assert(er.encoded != -1);
123 }
124 tmpbuf_size = er.encoded;
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400125 ASN_STRUCT_FREE(asn_DEF_INTEGER, stOut);
126
127 dump_data(lineno, tmpbuf, tmpbuf_size);
Lev Walkin486fd5c2017-07-10 22:08:14 -0700128
129 ret = asn_DEF_INTEGER.oer_decoder(0, &asn_DEF_INTEGER, constraints,
130 (void **)&stIn, tmpbuf, tmpbuf_size);
131 if(ret.code != RC_OK) {
132 /* Basic OER decode does not work */
133 fprintf(stderr, "%d: Failed oer_decode(value=%" PRIdMAX ", size=%zu)\n",
134 lineno, value, tmpbuf_size);
135 assert(ret.code == 0);
136 } else {
137 intmax_t outcome;
138 if(asn_INTEGER2imax(stIn, &outcome) != 0) {
139 /* Result of decode is structurally incorrect */
140 fprintf(stderr,
141 "%d: Failed to convert INTEGER 2 imax; structurally "
142 "incorrect INTEGER\n",
143 lineno);
144 assert(!"Unreachable");
145 } else if(outcome != value) {
146 /* Decoded value is wrong */
147 fprintf(stderr,
148 "%d: Decode result %" PRIdMAX " is not expected %" PRIdMAX
149 "\n",
150 lineno, outcome, value);
151 assert(outcome == value);
152 }
153 }
154
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400155 ASN_STRUCT_FREE(asn_DEF_INTEGER, stIn);
Lev Walkin486fd5c2017-07-10 22:08:14 -0700156 fprintf(stderr, "%d: Decode result %" PRIdMAX "\n", lineno, value);
157}
158
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400159static void
Lev Walkin4118ccf2017-08-02 10:37:31 -0700160check_encode(int lineno, int bad, intmax_t value, unsigned width, unsigned positive) {
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400161 uint8_t tmpbuf[32];
162
163 fprintf(stderr, "\n%d: OER encode value %" PRIdMAX "\n", lineno, value);
164
165 INTEGER_t *stOut = (INTEGER_t *)calloc(1, sizeof(*stOut));
166 asn_enc_rval_t er;
167 asn_oer_constraints_t *constraints =
Lev Walkin4118ccf2017-08-02 10:37:31 -0700168 setup_constraints(lineno, "encoding", width, positive);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400169
170 if(asn_imax2INTEGER(stOut, value) == -1) {
171 assert(!"Unreachable imax2INTEGER failure");
172 } else {
173 assert(stOut->buf != NULL);
174 assert(stOut->size != 0);
175 }
176
177 er = oer_encode_to_buffer(&asn_DEF_INTEGER, constraints, stOut, tmpbuf,
178 sizeof(tmpbuf));
179 if(er.encoded == -1) {
180 fprintf(stderr, "%d: OER encode failed for %s%s\n", lineno,
181 er.failed_type ? er.failed_type->name : "<none>",
182 bad ? " (expected)" : "");
183 if(!bad) {
184 assert(er.encoded != -1);
185 }
186 } else {
187 dump_data(lineno, tmpbuf, er.encoded);
188 if(bad) {
189 assert(er.encoded == -1);
190 }
191 }
192 ASN_STRUCT_FREE(asn_DEF_INTEGER, stOut);
193}
194
Lev Walkined3a4ae2017-07-07 10:09:51 -0700195int
196main() {
Lev Walkine4d8c922017-07-10 20:29:33 -0700197 CHECK_DECODE(RC_WMORE, 0, "", 0, "bounds=", 0, 0);
Lev Walkin4118ccf2017-08-02 10:37:31 -0700198 CHECK_DECODE(RC_FAIL, 0, "\x00", 1, "bounds=", 0, 0);
199 CHECK_DECODE(RC_WMORE, 0, "", 0, "bounds=", 1, 0);
200 CHECK_DECODE(RC_WMORE, 0, "", 0, "bounds=", 1, 1);
201 CHECK_DECODE(RC_OK, 0, "\x00", 1, "bounds=", 1, 1);
202 CHECK_DECODE(RC_OK, 0, "\x00", 1, "bounds=", 1, 0);
Lev Walkine4d8c922017-07-10 20:29:33 -0700203
Lev Walkin4118ccf2017-08-02 10:37:31 -0700204 CHECK_DECODE(RC_OK, 0, "\x00", 1, "bounds=", 1, 0);
205 CHECK_DECODE(RC_OK, 1, "\x01", 1, "bounds=", 1, 0);
206 CHECK_DECODE(RC_OK, -1, "\xff", 1, "bounds=", 1, 0);
207 CHECK_DECODE(RC_OK, -1, "\xff", 1, "bounds=", 1, 0);
208 CHECK_DECODE(RC_OK, 127, "\x7f", 1, "bounds=", 1, 1);
209 CHECK_DECODE(RC_OK, 255, "\xff", 1, "bounds=", 1, 1);
210 CHECK_DECODE(RC_OK, 255, "\xff", 1, "bounds=", 1, 1);
211 CHECK_DECODE(RC_WMORE, 0, "\xff", 1, "bounds=", 2, 1);
212 CHECK_DECODE(RC_OK, 65535, "\xff\xff", 2, "bounds=", 2, 1);
Lev Walkine4d8c922017-07-10 20:29:33 -0700213
Lev Walkin4118ccf2017-08-02 10:37:31 -0700214 CHECK_DECODE(RC_OK, 0, "\x01\x00", 2, "bounds=", 0, 0);
215 CHECK_DECODE(RC_OK, 1, "\x01\x01", 2, "bounds=", 0, 0);
216 CHECK_DECODE(RC_OK, -1, "\x1\xff", 2, "bounds=", 0, 0);
217 CHECK_DECODE(RC_OK, -1, "\x1\xff", 2, "bounds=", 0, 0);
218 CHECK_DECODE(RC_OK, -1, "\x1\xff", 2, "bounds=", 0, 0);
219 CHECK_DECODE(RC_OK, 255, "\x1\xff", 2, "bounds=", 0, 1);
220 CHECK_DECODE(RC_WMORE, -1, "\x02\x00\xff", 2, "bounds=", 0, 0);
221 CHECK_DECODE(RC_OK, 255, "\x02\x00\xff", 3, "bounds=", 0, 0);
Lev Walkin486fd5c2017-07-10 22:08:14 -0700222
Lev Walkin4118ccf2017-08-02 10:37:31 -0700223 CHECK_ROUNDTRIP(0, 0, 0);
224 CHECK_ROUNDTRIP(1, 0, 0);
225 CHECK_ROUNDTRIP(-1, 0, 0);
226 CHECK_ROUNDTRIP(-65000, 0, 0);
227 CHECK_ROUNDTRIP(65000, 0, 0);
228 CHECK_ROUNDTRIP(65535, 0, 0);
229 CHECK_ROUNDTRIP(-65535, 0, 0);
230 CHECK_ROUNDTRIP(-65536, 0, 0);
231 CHECK_ROUNDTRIP(65536, 0, 0);
232 CHECK_ROUNDTRIP(0, 1, 0);
233 CHECK_ROUNDTRIP(1, 1, 0);
234 CHECK_ROUNDTRIP(-1, 1, 0);
235 CHECK_ROUNDTRIP(-127, 1, 0);
236 CHECK_ROUNDTRIP(-128, 1, 0);
237 CHECK_ROUNDTRIP(127, 1, 0);
238 CHECK_ROUNDTRIP(1, 2, 1);
239 CHECK_ROUNDTRIP(32000, 2, 1);
240 CHECK_ROUNDTRIP(32000, 2, 0);
241 CHECK_ROUNDTRIP(1, 2, 1);
242 CHECK_ROUNDTRIP(65535, 2, 1);
243 CHECK_ROUNDTRIP(65535, 4, 0);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400244
Lev Walkin4118ccf2017-08-02 10:37:31 -0700245 CHECK_ENCODE_OK(0, 1, 1);
246 CHECK_ENCODE_OK(255, 1, 1);
247 CHECK_ENCODE_BAD(256, 1, 1);
248 CHECK_ENCODE_OK(0, 1, 0);
249 CHECK_ENCODE_OK(127, 1, 0);
250 CHECK_ENCODE_OK(-128, 1, 0);
251 CHECK_ENCODE_BAD(-129, 1, 0);
252 CHECK_ENCODE_BAD(128, 1, 0);
253 CHECK_ENCODE_OK(-4900000000, 8, 0);
254 CHECK_ENCODE_OK(4900000000, 8, 0);
255 CHECK_ENCODE_OK(-2000000000, 8, 0);
256 CHECK_ENCODE_OK(-4000000000, 8, 0);
257 CHECK_ENCODE_BAD(-4900000000, 4, 1);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400258 CHECK_ENCODE_BAD(-1, 0, 4000000000);
Lev Walkin4118ccf2017-08-02 10:37:31 -0700259 CHECK_ENCODE_BAD(4900000000, 4, 1);
260 CHECK_ENCODE_OK(4100000000, 4, 1);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400261
262 for(size_t i = 0; i < 7 ; i++) {
263 intmax_t value = (intmax_t)1 << i;
Lev Walkin4118ccf2017-08-02 10:37:31 -0700264 CHECK_ROUNDTRIP(value, 1, 1);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400265 value = -value;
Lev Walkin4118ccf2017-08-02 10:37:31 -0700266 CHECK_ROUNDTRIP(value, 1, 0);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400267 }
268
269 for(size_t i = 0; i < 16 ; i++) {
270 intmax_t value = (intmax_t)1 << i;
Lev Walkin4118ccf2017-08-02 10:37:31 -0700271 CHECK_ROUNDTRIP(value, 2, 1);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400272 value = -value;
Lev Walkin4118ccf2017-08-02 10:37:31 -0700273 CHECK_ROUNDTRIP(value, 2, 0);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400274 }
275
276 for(size_t i = 0; i < 32 ; i++) {
277 intmax_t value = (intmax_t)1 << i;
Lev Walkin4118ccf2017-08-02 10:37:31 -0700278 CHECK_ROUNDTRIP(value, 4, 1);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400279 value = -value;
Lev Walkin4118ccf2017-08-02 10:37:31 -0700280 CHECK_ROUNDTRIP(value, 4, 0);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400281 }
282
283 for(size_t i = 0; i < 8 * sizeof(intmax_t) ; i++) {
284 intmax_t value = (intmax_t)1 << i;
Lev Walkin4118ccf2017-08-02 10:37:31 -0700285 CHECK_ROUNDTRIP(value, 8, 0);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400286 value = -value;
Lev Walkin4118ccf2017-08-02 10:37:31 -0700287 CHECK_ROUNDTRIP(value, 8, 0);
288 }
289
290 for(size_t i = 0; i < 8 * sizeof(intmax_t) ; i++) {
291 intmax_t value = (intmax_t)1 << i;
292 CHECK_ROUNDTRIP(value, 0, 0);
293 value = -value;
294 CHECK_ROUNDTRIP(value, 0, 0);
Lev Walkincc9b3ae2017-07-14 08:57:02 +0400295 }
Lev Walkin486fd5c2017-07-10 22:08:14 -0700296
Lev Walkined3a4ae2017-07-07 10:09:51 -0700297}