4
* Copyright Ericsson AB 2004-2010. All Rights Reserved.
6
* The contents of this file are subject to the Erlang Public License,
7
* Version 1.1, (the "License"); you may not use this file except in
8
* compliance with the License. You should have received a copy of the
9
* Erlang Public License along with this software. If not, it can be
10
* retrieved online at http://www.erlang.org/.
12
* Software distributed under the License is distributed on an "AS IS"
13
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
* the License for the specific language governing rights and limitations
24
#include "ei_runner.h"
27
* Purpose: Tests the ei_format() function.
32
#define MESSAGE_BACK(SIZE) \
33
message("err = %d, size2 = %d, expected size = %d", \
36
#define MESSAGE_BACK(SIZE) \
37
message("err = %d, size2 = %d, expected size = %d, long long val = %lld", \
38
err, size1, SIZE, (EI_LONGLONG)p);
41
#define EI_DECODE_2(FUNC,SIZE,TYPE,VAL) \
48
message("ei_" #FUNC " " #TYPE " should be " #VAL); \
49
buf = read_packet(NULL); \
51
err = ei_ ## FUNC(buf+1, &size1, NULL); \
52
message("err = %d, size1 = %d, expected size = %d", \
56
fail("returned non zero but not -1 if NULL pointer"); \
58
fail("returned non zero if NULL pointer"); \
63
err = ei_ ## FUNC(buf+1, &size2, &p); \
67
fail("returned non zero but not -1"); \
69
fail("returned non zero"); \
73
if (p != (TYPE)VAL) { \
74
fail("value is not correct"); \
78
if (size1 != size2) { \
79
fail("size with and without pointer differs"); \
83
if (size1 != SIZE) { \
84
fail("size of encoded data is incorrect"); \
89
#define EI_DECODE_2_FAIL(FUNC,SIZE,TYPE,VAL) \
96
message("ei_" #FUNC " " #TYPE " should fail"); \
97
memset(&p,'\0',sizeof(p)); \
99
buf = read_packet(NULL); \
101
err = ei_ ## FUNC(buf+1, &size1, NULL); \
102
message("err = %d, size1 = %d, expected size = %d", \
105
fail("should return -1 if NULL pointer"); \
109
err = ei_ ## FUNC(buf+1, &size2, &p); \
110
message("err = %d, size2 = %d, expected size = %d", \
113
fail("should return -1"); \
116
if (p != saved_p) { \
117
fail("p argument was modified"); \
122
fail("size of encoded data should be 0 if NULL"); \
127
fail("size of encoded data should be 0"); \
132
#define EI_DECODE_STRING(FUNC,SIZE,VAL) \
139
message("ei_" #FUNC " should be " #VAL); \
140
buf = read_packet(NULL); \
142
err = ei_ ## FUNC(buf+1, &size1, NULL); \
143
message("err = %d, size = %d, expected size = %d\n",err,size1,SIZE); \
146
fail("returned non zero but not -1 if NULL pointer"); \
148
fail("returned non zero if NULL pointer"); \
153
err = ei_ ## FUNC(buf+1, &size2, p); \
154
message("err = %d, size = %d, expected size = %d\n",err,size2,SIZE); \
157
fail("returned non zero but not -1"); \
159
fail("returned non zero"); \
164
if (strcmp(p,VAL) != 0) { \
165
fail("value is not correct"); \
169
if (size1 != size2) { \
170
fail("size with and without pointer differs"); \
174
if (size1 != SIZE) { \
175
fail("size of encoded data is incorrect"); \
180
#define EI_DECODE_BIN(FUNC,SIZE,VAL,LEN) \
188
message("ei_" #FUNC " should be " #VAL); \
189
buf = read_packet(NULL); \
190
err = ei_ ## FUNC(buf+1, &size1, NULL, &len); \
191
message("err = %d, size = %d, len = %d, expected size = %d, expected len = %d\n",\
192
err,size1,len,SIZE,LEN); \
195
fail("returned non zero but not -1 if NULL pointer"); \
197
fail("returned non zero"); \
203
fail("size is not correct"); \
207
err = ei_ ## FUNC(buf+1, &size2, p, &len); \
208
message("err = %d, size = %d, len = %d, expected size = %d, expected len = %d\n",\
209
err,size2,len,SIZE,LEN); \
212
fail("returned non zero but not -1 if NULL pointer"); \
214
fail("returned non zero"); \
220
fail("size is not correct"); \
224
if (strncmp(p,VAL,LEN) != 0) { \
225
fail("value is not correct"); \
229
if (size1 != size2) { \
230
fail("size with and without pointer differs"); \
234
if (size1 != SIZE) { \
235
fail("size of encoded data is incorrect"); \
240
/* ******************************************************************** */
242
TESTCASE(test_ei_decode_long)
244
EI_DECODE_2 (decode_long, 2, long, 0);
245
EI_DECODE_2 (decode_long, 2, long, 255);
246
EI_DECODE_2 (decode_long, 5, long, 256);
247
EI_DECODE_2 (decode_long, 5, long, -1);
249
/* Old 28 bit limits for INTEGER_EXT */
250
EI_DECODE_2 (decode_long, 5, long, 0x07ffffff);
251
EI_DECODE_2 (decode_long, 5, long, -0x08000000);
252
EI_DECODE_2 (decode_long, 5, long, 0x08000000);
253
EI_DECODE_2 (decode_long, 5, long, -0x08000001);
255
/* New 32 bit limits for INTEGER_EXT */
256
EI_DECODE_2 (decode_long, 5, long, 0x7fffffff);
257
EI_DECODE_2 (decode_long, 5, long, -ll(0x80000000)); /* Strange :-( */
258
if (sizeof(long) > 4) {
259
EI_DECODE_2(decode_long, 7, long, 0x80000000);
260
EI_DECODE_2(decode_long, 7, long, -ll(0x80000001));
263
EI_DECODE_2_FAIL(decode_long, 7, long, 0x80000000);
264
EI_DECODE_2_FAIL(decode_long, 7, long, -ll(0x80000001));
267
EI_DECODE_2_FAIL(decode_long, 7, long, 0x80000000);
268
EI_DECODE_2_FAIL(decode_long, 7, long, 0xffffffff);
270
EI_DECODE_2_FAIL(decode_long, 9, long, ll(0x7fffffffffff));
271
EI_DECODE_2_FAIL(decode_long, 9, long, -ll(0x800000000000));
272
EI_DECODE_2_FAIL(decode_long, 9, long, ll(0xffffffffffff));
273
EI_DECODE_2_FAIL(decode_long, 11, long, ll(0x7fffffffffffffff));
274
EI_DECODE_2_FAIL(decode_long, 11, long, -ll(0x8000000000000000));
275
EI_DECODE_2_FAIL(decode_long, 11, long, ll(0xffffffffffffffff));
277
EI_DECODE_2_FAIL(decode_long, 1, long, 0); /* Illegal type sent */
282
/* ******************************************************************** */
284
TESTCASE(test_ei_decode_ulong)
286
EI_DECODE_2 (decode_ulong, 2, unsigned long, 0);
287
EI_DECODE_2 (decode_ulong, 2, unsigned long, 255);
288
EI_DECODE_2 (decode_ulong, 5, unsigned long, 256);
289
EI_DECODE_2_FAIL(decode_ulong, 5, unsigned long, -1);
291
EI_DECODE_2 (decode_ulong, 5, unsigned long, 0x07ffffff);
292
EI_DECODE_2_FAIL(decode_ulong, 5, unsigned long, -0x08000000);
293
EI_DECODE_2 (decode_ulong, 5, unsigned long, 0x08000000);
294
EI_DECODE_2_FAIL(decode_ulong, 5, unsigned long, -0x08000001);
296
EI_DECODE_2 (decode_ulong, 5, unsigned long, 0x7fffffff);
297
EI_DECODE_2_FAIL(decode_ulong, 5, unsigned long, -ll(0x80000000));
298
EI_DECODE_2 (decode_ulong, 7, unsigned long, 0x80000000);
299
EI_DECODE_2_FAIL(decode_ulong, 7, unsigned long, -ll(0x80000001));
301
if (sizeof(long) > 4) {
302
EI_DECODE_2 (decode_ulong, 11, unsigned long, ll(0x8000000000000000));
303
EI_DECODE_2 (decode_ulong, 11, unsigned long, ll(0xffffffffffffffff));
305
EI_DECODE_2 (decode_ulong, 7, unsigned long, 0x80000000);
306
EI_DECODE_2 (decode_ulong, 7, unsigned long, 0xffffffff);
309
EI_DECODE_2_FAIL(decode_ulong, 9, unsigned long, ll(0x7fffffffffff));
310
EI_DECODE_2_FAIL(decode_ulong, 9, unsigned long, -ll(0x800000000000));
311
EI_DECODE_2_FAIL(decode_ulong, 9, unsigned long, ll(0xffffffffffff));
312
EI_DECODE_2_FAIL(decode_ulong, 11, unsigned long, ll(0x7fffffffffffffff));
313
EI_DECODE_2_FAIL(decode_ulong, 11, unsigned long, -ll(0x8000000000000000));
314
EI_DECODE_2_FAIL(decode_ulong, 11, unsigned long, ll(0xffffffffffffffff));
316
EI_DECODE_2_FAIL(decode_ulong, 1, unsigned long, 0); /* Illegal type */
321
/* ******************************************************************** */
324
TESTCASE(test_ei_decode_longlong)
327
EI_DECODE_2 (decode_longlong, 2, EI_LONGLONG, 0);
328
EI_DECODE_2 (decode_longlong, 2, EI_LONGLONG, 255);
329
EI_DECODE_2 (decode_longlong, 5, EI_LONGLONG, 256);
330
EI_DECODE_2 (decode_longlong, 5, EI_LONGLONG, -1);
332
EI_DECODE_2 (decode_longlong, 5, EI_LONGLONG, 0x07ffffff);
333
EI_DECODE_2 (decode_longlong, 5, EI_LONGLONG, -0x08000000);
334
EI_DECODE_2 (decode_longlong, 5, EI_LONGLONG, 0x08000000);
335
EI_DECODE_2 (decode_longlong, 5, EI_LONGLONG, -0x08000001);
337
EI_DECODE_2 (decode_longlong, 5, EI_LONGLONG, 0x7fffffff);
338
EI_DECODE_2 (decode_longlong, 5, EI_LONGLONG, -ll(0x80000000));
339
EI_DECODE_2 (decode_longlong, 7, EI_LONGLONG, 0x80000000);
340
EI_DECODE_2 (decode_longlong, 7, EI_LONGLONG, -ll(0x80000001));
342
EI_DECODE_2 (decode_longlong, 7, EI_LONGLONG, 0xffffffff);
344
EI_DECODE_2 (decode_longlong, 9, EI_LONGLONG, ll(0x7fffffffffff));
345
EI_DECODE_2 (decode_longlong, 9, EI_LONGLONG, -ll(0x800000000000));
346
EI_DECODE_2 (decode_longlong, 9, EI_LONGLONG, ll(0xffffffffffff));
347
EI_DECODE_2 (decode_longlong, 11, EI_LONGLONG, ll(0x7fffffffffffffff));
348
EI_DECODE_2 (decode_longlong, 11, EI_LONGLONG, -ll(0x8000000000000000));
349
EI_DECODE_2_FAIL(decode_longlong, 11, EI_LONGLONG, ll(0xffffffffffffffff));
351
EI_DECODE_2_FAIL(decode_longlong, 1, EI_LONGLONG, 0); /* Illegal type */
356
/* ******************************************************************** */
358
TESTCASE(test_ei_decode_ulonglong)
361
EI_DECODE_2 (decode_ulonglong, 2, EI_ULONGLONG, 0);
362
EI_DECODE_2 (decode_ulonglong, 2, EI_ULONGLONG, 255);
363
EI_DECODE_2 (decode_ulonglong, 5, EI_ULONGLONG, 256);
364
EI_DECODE_2_FAIL(decode_ulonglong, 5, EI_ULONGLONG, -1);
366
EI_DECODE_2 (decode_ulonglong, 5, EI_ULONGLONG, 0x07ffffff);
367
EI_DECODE_2_FAIL(decode_ulonglong, 5, EI_ULONGLONG, -0x08000000);
368
EI_DECODE_2 (decode_ulonglong, 5, EI_ULONGLONG, 0x08000000);
369
EI_DECODE_2_FAIL(decode_ulonglong, 5, EI_ULONGLONG, -0x08000001);
371
EI_DECODE_2 (decode_ulonglong, 5, EI_ULONGLONG, 0x7fffffff);
372
EI_DECODE_2_FAIL(decode_ulonglong, 5, EI_ULONGLONG, -ll(0x80000000));
373
EI_DECODE_2 (decode_ulonglong, 7, EI_ULONGLONG, 0x80000000);
374
EI_DECODE_2_FAIL(decode_ulonglong, 7, EI_ULONGLONG, -0x80000001);
376
EI_DECODE_2 (decode_ulonglong, 7, EI_ULONGLONG, 0xffffffff);
378
EI_DECODE_2 (decode_ulonglong, 9, EI_ULONGLONG, ll(0x7fffffffffff));
379
EI_DECODE_2_FAIL(decode_ulonglong, 9, EI_ULONGLONG, -ll(0x800000000000));
380
EI_DECODE_2 (decode_ulonglong, 9, EI_ULONGLONG, ll(0xffffffffffff));
381
EI_DECODE_2 (decode_ulonglong,11, EI_ULONGLONG, ll(0x7fffffffffffffff));
382
EI_DECODE_2_FAIL(decode_ulonglong,11, EI_ULONGLONG, -ll(0x8000000000000000));
383
EI_DECODE_2 (decode_ulonglong,11, EI_ULONGLONG, ll(0xffffffffffffffff));
385
EI_DECODE_2_FAIL(decode_ulonglong, 1, EI_ULONGLONG, 0); /* Illegal type */
391
/* ******************************************************************** */
393
TESTCASE(test_ei_decode_char)
395
EI_DECODE_2(decode_char, 2, char, 0);
396
EI_DECODE_2(decode_char, 2, char, 0x7f);
397
EI_DECODE_2(decode_char, 2, char, 0xff);
399
EI_DECODE_2_FAIL(decode_char, 1, char, 0); /* Illegal type */
404
/* ******************************************************************** */
406
TESTCASE(test_ei_decode_nonoptimal)
408
EI_DECODE_2(decode_char, 2, char, 42);
409
EI_DECODE_2(decode_char, 5, char, 42);
410
EI_DECODE_2(decode_char, 4, char, 42);
411
EI_DECODE_2(decode_char, 5, char, 42);
412
EI_DECODE_2(decode_char, 7, char, 42);
413
EI_DECODE_2(decode_char, 7, char, 42);
414
EI_DECODE_2(decode_char, 8, char, 42);
415
EI_DECODE_2(decode_char, 9, char, 42);
416
EI_DECODE_2(decode_char, 12, char, 42);
418
/* EI_DECODE_2(decode_char, char, -42); */
419
/* EI_DECODE_2(decode_char, char, -42); */
420
/* EI_DECODE_2(decode_char, char, -42); */
421
/* EI_DECODE_2(decode_char, char, -42); */
422
/* EI_DECODE_2(decode_char, char, -42); */
423
/* EI_DECODE_2(decode_char, char, -42); */
424
/* EI_DECODE_2(decode_char, char, -42); */
425
/* EI_DECODE_2(decode_char, char, -42); */
426
/* EI_DECODE_2(decode_char, char, -42); */
428
/* ---------------------------------------------------------------- */
430
EI_DECODE_2(decode_long, 2, long, 42);
431
EI_DECODE_2(decode_long, 5, long, 42);
432
EI_DECODE_2(decode_long, 4, long, 42);
433
EI_DECODE_2(decode_long, 5, long, 42);
434
EI_DECODE_2(decode_long, 7, long, 42);
435
EI_DECODE_2(decode_long, 7, long, 42);
436
EI_DECODE_2(decode_long, 8, long, 42);
437
EI_DECODE_2(decode_long, 9, long, 42);
438
EI_DECODE_2(decode_long, 12, long, 42);
440
/* EI_DECODE_2(decode_long, 2, long, -42); */
441
EI_DECODE_2(decode_long, 5, long, -42);
442
EI_DECODE_2(decode_long, 4, long, -42);
443
EI_DECODE_2(decode_long, 5, long, -42);
444
EI_DECODE_2(decode_long, 7, long, -42);
445
EI_DECODE_2(decode_long, 7, long, -42);
446
EI_DECODE_2(decode_long, 8, long, -42);
447
EI_DECODE_2(decode_long, 9, long, -42);
448
EI_DECODE_2(decode_long, 12, long, -42);
450
/* ---------------------------------------------------------------- */
452
EI_DECODE_2(decode_ulong, 2, unsigned long, 42);
453
EI_DECODE_2(decode_ulong, 5, unsigned long, 42);
454
EI_DECODE_2(decode_ulong, 4, unsigned long, 42);
455
EI_DECODE_2(decode_ulong, 5, unsigned long, 42);
456
EI_DECODE_2(decode_ulong, 7, unsigned long, 42);
457
EI_DECODE_2(decode_ulong, 7, unsigned long, 42);
458
EI_DECODE_2(decode_ulong, 8, unsigned long, 42);
459
EI_DECODE_2(decode_ulong, 9, unsigned long, 42);
460
EI_DECODE_2(decode_ulong, 12, unsigned long, 42);
462
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
463
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
464
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
465
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
466
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
467
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
468
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
469
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
470
/* EI_DECODE_2(decode_ulong, unsigned long, -42); */
472
/* ---------------------------------------------------------------- */
476
EI_DECODE_2(decode_longlong, 2, EI_LONGLONG, 42);
477
EI_DECODE_2(decode_longlong, 5, EI_LONGLONG, 42);
478
EI_DECODE_2(decode_longlong, 4, EI_LONGLONG, 42);
479
EI_DECODE_2(decode_longlong, 5, EI_LONGLONG, 42);
480
EI_DECODE_2(decode_longlong, 7, EI_LONGLONG, 42);
481
EI_DECODE_2(decode_longlong, 7, EI_LONGLONG, 42);
482
EI_DECODE_2(decode_longlong, 8, EI_LONGLONG, 42);
483
EI_DECODE_2(decode_longlong, 9, EI_LONGLONG, 42);
484
EI_DECODE_2(decode_longlong, 12, EI_LONGLONG, 42);
486
/* EI_DECODE_2(decode_longlong, 2, EI_LONGLONG, -42); */
487
EI_DECODE_2(decode_longlong, 5, EI_LONGLONG, -42);
488
EI_DECODE_2(decode_longlong, 4, EI_LONGLONG, -42);
489
EI_DECODE_2(decode_longlong, 5, EI_LONGLONG, -42);
490
EI_DECODE_2(decode_longlong, 7, EI_LONGLONG, -42);
491
EI_DECODE_2(decode_longlong, 7, EI_LONGLONG, -42);
492
EI_DECODE_2(decode_longlong, 8, EI_LONGLONG, -42);
493
EI_DECODE_2(decode_longlong, 9, EI_LONGLONG, -42);
494
EI_DECODE_2(decode_longlong, 12, EI_LONGLONG, -42);
496
/* ---------------------------------------------------------------- */
498
EI_DECODE_2(decode_ulonglong, 2, EI_ULONGLONG, 42);
499
EI_DECODE_2(decode_ulonglong, 5, EI_ULONGLONG, 42);
500
EI_DECODE_2(decode_ulonglong, 4, EI_ULONGLONG, 42);
501
EI_DECODE_2(decode_ulonglong, 5, EI_ULONGLONG, 42);
502
EI_DECODE_2(decode_ulonglong, 7, EI_ULONGLONG, 42);
503
EI_DECODE_2(decode_ulonglong, 7, EI_ULONGLONG, 42);
504
EI_DECODE_2(decode_ulonglong, 8, EI_ULONGLONG, 42);
505
EI_DECODE_2(decode_ulonglong, 9, EI_ULONGLONG, 42);
506
EI_DECODE_2(decode_ulonglong, 12, EI_ULONGLONG, 42);
508
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
509
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
510
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
511
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
512
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
513
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
514
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
515
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
516
/* EI_DECODE_2(decode_ulonglong, EI_ULONGLONG, -42); */
518
#endif /* !VXWORKS */
520
/* ---------------------------------------------------------------- */
525
/* ******************************************************************** */
527
TESTCASE(test_ei_decode_misc)
530
EI_DECODE_0(decode_version);
532
EI_DECODE_2(decode_double, 32, double, 0.0);
533
EI_DECODE_2(decode_double, 32, double, -1.0);
534
EI_DECODE_2(decode_double, 32, double, 1.0);
536
EI_DECODE_2(decode_boolean, 8, int, 0);
537
EI_DECODE_2(decode_boolean, 7, int, 1);
539
EI_DECODE_STRING(decode_atom, 6, "foo");
540
EI_DECODE_STRING(decode_atom, 3, "");
541
EI_DECODE_STRING(decode_atom, 9, "������");
543
EI_DECODE_STRING(decode_string, 6, "foo");
544
EI_DECODE_STRING(decode_string, 1, "");
545
EI_DECODE_STRING(decode_string, 9, "������");
547
EI_DECODE_BIN(decode_binary, 8, "foo", 3);
548
EI_DECODE_BIN(decode_binary, 5, "", 0);
549
EI_DECODE_BIN(decode_binary, 11, "������", 6);
551
/* FIXME check \0 in strings and atoms? */
553
EI_ENCODE_1(decode_tuple_header, 0);
555
EI_ENCODE_0(decode_empty_list);
560
/* ******************************************************************** */