4
* Copyright Ericsson AB 1997-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
21
* Purpose: Tests the functions in erl_eterm.c and erl_malloc.c.
22
* Author: Bjorn Gustavsson
24
* See the erl_eterm_SUITE.erl file for a "table of contents".
33
* Find out which version of erl_interface we are using.
37
#undef NEW_ERL_INTERFACE
39
#define NEW_ERL_INTERFACE
42
void dump_term (FILE *fp, ETERM *t);
44
static ETERM* all_types();
46
/***********************************************************************
48
* 1. B a s i c t e s t s
50
***********************************************************************/
53
* Sends a list contaning all data types to the Erlang side.
66
static int abs_and_sign(ETERM* v, unsigned long long* av, int* sign)
69
switch (ERL_TYPE(v)) {
70
case ERL_INTEGER: sv = ERL_INT_VALUE(v); break;
71
case ERL_U_INTEGER: *av = ERL_INT_UVALUE(v); *sign = 0; return 1;
72
case ERL_LONGLONG: sv = ERL_LL_VALUE(v); break;
73
case ERL_U_LONGLONG: *av = ERL_LL_UVALUE(v); *sign = 0; return 1;
87
/* Shouldn't erl_match() cope with this?
89
static int eq_ints(ETERM* a, ETERM* b)
91
unsigned long long a_abs, b_abs;
93
return abs_and_sign(a, &a_abs, &a_sign) && abs_and_sign(b, &b_abs, &b_sign)
94
&& (a_abs == b_abs) && (a_sign == b_sign);
97
static void encode_decode(ETERM* original, const char* text)
99
static unsigned char encoded[16*1024];
105
/* If a list, check the elements one by one first */
106
head = erl_hd(original);
108
encode_decode(head, "CAR");
109
encode_decode(erl_tl(original), "CDR");
112
bytes = erl_encode(original, encoded);
114
fail("failed to encode terms");
116
else if (bytes > sizeof(encoded)) {
117
fail("encoded terms buffer overflow");
119
else if (bytes != (len=erl_term_len(original))) {
120
fprintf(stderr, "bytes(%d) != len(%d) for term ", bytes, len);
121
erl_print_term(stderr, original);
122
fprintf(stderr, " [%s]\r\n", text);
123
fail("erl_encode and erl_term_len do not agree");
125
else if ((new_terms = erl_decode(encoded)) == NULL) {
126
fail("failed to decode terms");
128
else if (!erl_match(original, new_terms) && !eq_ints(original, new_terms)) {
129
erl_print_term(stderr, original);
130
fprintf(stderr, "(%i) != (%i)", ERL_TYPE(original), ERL_TYPE(new_terms));
131
erl_print_term(stderr, new_terms);
132
fprintf(stderr, " [%s]\r\n", text);
133
fail("decoded terms didn't match original");
135
erl_free_term(original);
136
erl_free_term(new_terms);
139
* Converts an Erlang term to the external term format and back again.
142
TESTCASE(round_trip_conversion)
147
encode_decode(all_types(), "ALL");
151
for (v = 8; v; v <<= 1) {
152
for (i=-4; i<4; i++) {
153
encode_decode(erl_mk_int(v+i), "INT");
154
encode_decode(erl_mk_int(-(v+i)), "NEG INT");
160
for (v = 8; v; v <<= 1) {
161
for (i=-4; i<4; i++) {
162
encode_decode(erl_mk_uint(v+i), "UINT");
168
for (v = 8; v; v <<= 1) {
169
for (i=-4; i<4; i++) {
170
encode_decode(erl_mk_longlong(v+i), "LONGLONG");
171
encode_decode(erl_mk_longlong(-(v+i)), "NEG LONGLONG");
176
unsigned long long v;
177
for (v = 8; v; v <<= 1) {
178
for (i=-4; i<4; i++) {
179
encode_decode(erl_mk_ulonglong(v+i), "ULONGLONG");
188
* Decodes data from the Erlang side and verifies.
191
TESTCASE(decode_terms)
199
fail("unexpected end of file");
206
all = p = all_types();
210
* XXX For now, skip the reference, pid, and port, because
211
* the match will fail. Must write code here to do some other
215
for (i=0; i<6; i++) {
225
* Match the tail of the lists.
228
if (!erl_match(p, t))
230
fail("Received terms didn't match expected");
233
erl_free_term(terms);
239
* Decodes a float from the Erlang side and verifies.
242
TESTCASE(decode_float)
250
efnum = erl_mk_float(3.1415);
251
result = erl_match(efnum, afnum);
252
erl_free_term(afnum);
253
erl_free_term(efnum);
258
* Tests the erl_free_compound() function.
261
TESTCASE(t_erl_free_compound)
268
erl_free_compound(t);
273
/***********************************************************************
275
* 2. C o n s t r u c t i n g t e r m s
277
***********************************************************************/
280
* Makes various integers, and sends them to Erlang for verification.
283
TESTCASE(t_erl_mk_int)
285
#define SEND_INT(i) \
287
ETERM* t = erl_mk_int(i); \
302
SEND_INT(0x07FFFFFF);
303
SEND_INT(0x0FFFFFFF);
304
SEND_INT(0x1FFFFFFF);
305
SEND_INT(0x3FFFFFFF);
306
SEND_INT(0x7FFFFFFF);
308
SEND_INT(0x08000000);
309
SEND_INT(0x10000000);
310
SEND_INT(0x20000000);
311
SEND_INT(0x40000000);
313
SEND_INT(-0x07FFFFFF);
314
SEND_INT(-0x0FFFFFFF);
315
SEND_INT(-0x1FFFFFFF);
316
SEND_INT(-0x3FFFFFFF);
317
SEND_INT(-0x7FFFFFFF);
319
SEND_INT(-0x08000000);
320
SEND_INT(-0x10000000);
321
SEND_INT(-0x20000000);
322
SEND_INT(-0x40000000);
324
SEND_INT(-0x08000001);
325
SEND_INT(-0x10000001);
326
SEND_INT(-0x20000001);
327
SEND_INT(-0x40000001);
329
SEND_INT(-0x08000002);
330
SEND_INT(-0x10000002);
331
SEND_INT(-0x20000002);
332
SEND_INT(-0x40000002);
334
SEND_INT(-1999999999);
335
SEND_INT(-2000000000);
336
SEND_INT(-2000000001);
343
* Makes lists of various sizes, and sends them to Erlang for verification.
346
TESTCASE(t_erl_mk_list)
356
send_term(erl_mk_list(a, 0));
362
a[0] = erl_mk_atom("abc");
363
send_term(erl_mk_list(a, 1));
367
* Two elements: [abcdef, 42].
370
a[0] = erl_mk_atom("abcdef");
371
a[1] = erl_mk_int(42);
372
send_term(erl_mk_list(a, 2));
380
a[0] = erl_mk_float(0.0);
381
a[1] = erl_mk_int(23);
382
a[2] = erl_mk_empty_list();
383
a[3] = erl_mk_float(3.1415);
384
send_term(erl_mk_list(a, 4));
394
* A basic test of erl_copy_term().
404
original = all_types();
405
copy = erl_copy_term(original);
407
fail("erl_copy_term() failed");
408
} else if (!erl_match(original, copy))
410
fail("copy doesn't match original");
413
erl_free_term(original);
420
* A basic test of erl_mk_atom().
423
TESTCASE(t_erl_mk_atom)
427
send_term(erl_mk_atom("madonna"));
428
send_term(erl_mk_atom("Madonna"));
429
send_term(erl_mk_atom("mad donna"));
430
send_term(erl_mk_atom("_madonna_"));
431
send_term(erl_mk_atom("/home/madonna/tour_plan"));
432
send_term(erl_mk_atom("http://www.madonna.com/tour_plan"));
433
send_term(erl_mk_atom("\'madonna\'"));
434
send_term(erl_mk_atom("\"madonna\""));
435
send_term(erl_mk_atom("\\madonna\\"));
436
send_term(erl_mk_atom("{madonna,21,'mad donna',12}"));
443
* A basic test of erl_mk_binary().
446
TESTCASE(t_erl_mk_binary)
452
string = "{madonna,21,'mad donna',1234.567.890, !#$%&/()=?+-@, \" \\}";
453
send_term(erl_mk_binary(string,strlen(string)));
460
* A basic test of erl_mk_empty_list().
463
TESTCASE(t_erl_mk_empty_list)
467
send_term(erl_mk_empty_list());
473
* A basic test of erl_mk_float().
476
TESTCASE(t_erl_mk_float)
483
arr[0] = erl_mk_float(3.1415);
484
arr[1] = erl_mk_float(1.999999);
485
arr[2] = erl_mk_float(2.000000);
486
arr[3] = erl_mk_float(2.000001);
487
arr[4] = erl_mk_float(2.000002);
488
arr[5] = erl_mk_float(12345.67890);
489
emsg = (erl_mk_tuple(arr,6));
493
erl_free_array(arr,6);
494
/* emsg already freed by send_term() */
495
/* erl_free_term(emsg); */
502
* A basic test of erl_mk_pid().
505
TESTCASE(t_erl_mk_pid)
509
send_term(erl_mk_pid("kalle@localhost", 3, 2, 1));
514
* A basic test of erl_mk_pid().
517
TESTCASE(t_erl_mk_xpid)
521
send_term(erl_mk_pid("kalle@localhost", 32767, 8191, 1));
527
* A basic test of erl_mk_port().
530
TESTCASE(t_erl_mk_port)
534
send_term(erl_mk_port("kalle@localhost", 4, 1));
539
* A basic test of erl_mk_port().
542
TESTCASE(t_erl_mk_xport)
546
send_term(erl_mk_port("kalle@localhost", 268435455, 1));
551
* A basic test of erl_mk_ref().
554
TESTCASE(t_erl_mk_ref)
558
send_term(erl_mk_ref("kalle@localhost", 6, 1));
563
* A basic test of erl_mk_long_ref().
567
TESTCASE(t_erl_mk_long_ref)
571
send_term(erl_mk_long_ref("kalle@localhost",
572
4294967295, 4294967295, 262143,
579
* A basic test of erl_mk_string().
582
TESTCASE(t_erl_mk_string)
587
send_term(erl_mk_string("madonna"));
588
send_term(erl_mk_string("Madonna"));
589
send_term(erl_mk_string("mad donna"));
590
send_term(erl_mk_string("_madonna_"));
591
send_term(erl_mk_string("/home/madonna/tour_plan"));
592
send_term(erl_mk_string("http://www.madonna.com/tour_plan"));
593
send_term(erl_mk_string("\'madonna\'"));
594
send_term(erl_mk_string("\"madonna\""));
595
send_term(erl_mk_string("\\madonna\\"));
596
send_term(erl_mk_string("{madonna,21,'mad donna',12}"));
603
* A basic test of erl_mk_estring().
606
TESTCASE(t_erl_mk_estring)
612
send_term(erl_mk_estring(string,strlen(string)));
614
send_term(erl_mk_estring(string,strlen(string)));
615
string = "mad donna";
616
send_term(erl_mk_estring(string,strlen(string)));
617
string = "_madonna_";
618
send_term(erl_mk_estring(string,strlen(string)));
619
string = "/home/madonna/tour_plan";
620
send_term(erl_mk_estring(string,strlen(string)));
621
string = "http://www.madonna.com/tour_plan";
622
send_term(erl_mk_estring(string,strlen(string)));
623
string = "\'madonna\'";
624
send_term(erl_mk_estring(string,strlen(string)));
625
string = "\"madonna\"";
626
send_term(erl_mk_estring(string,strlen(string)));
627
string = "\\madonna\\";
628
send_term(erl_mk_estring(string,strlen(string)));
629
string = "{madonna,21,'mad donna',12}";
630
send_term(erl_mk_estring(string,strlen(string)));
637
* A basic test of erl_mk_tuple().
640
TESTCASE(t_erl_mk_tuple)
649
/* {madonna,21,'mad donna',12} */
650
arr[0] = erl_mk_atom("madonna");
651
arr[1] = erl_mk_int(21);
652
arr[2] = erl_mk_atom("mad donna");
653
arr[3] = erl_mk_int(12);
655
send_term(erl_mk_tuple(arr,4));
657
erl_free_array(arr,4);
660
/* {'Madonna',21,{children,{"Isabella",2}},{'home page',"http://www.madonna.com/"} */
661
arr4[0] = erl_mk_atom("home page");
662
arr4[1] = erl_mk_string("http://www.madonna.com/");
664
arr3[0] = erl_mk_string("Isabella");
665
arr3[1] = erl_mk_int(2);
667
arr2[0] = erl_mk_atom("children");
668
arr2[1] = erl_mk_tuple(arr3,2);
670
arr[0] = erl_mk_atom("Madonna");
671
arr[1] = erl_mk_int(21);
672
arr[2] = erl_mk_tuple(arr2,2);
673
arr[3] = erl_mk_tuple(arr4,2);
675
send_term(erl_mk_tuple(arr,4));
677
erl_free_array(arr,4);
678
erl_free_array(arr2,2);
679
erl_free_array(arr3,2);
680
erl_free_array(arr4,2);
688
* A basic test of erl_mk_uint().
691
TESTCASE(t_erl_mk_uint)
697
send_term(erl_mk_uint(54321));
699
send_term(erl_mk_uint(i));
700
send_term(erl_mk_uint(i+1));
701
send_term(erl_mk_uint(i+2));
702
send_term(erl_mk_uint(i+3));
703
send_term(erl_mk_uint(i+i+1));
710
* A basic test of erl_mk_var().
713
TESTCASE(t_erl_mk_var)
726
/* match unbound/bound variable against an integer */
727
term = erl_mk_int(17);
728
term2 = erl_mk_int(2);
729
mk_var = erl_mk_var("New_var");
730
send_term(erl_mk_int(erl_match(mk_var, term))); /* should be ok */
731
send_term(erl_mk_int(erl_match(mk_var, term2))); /* should fail */
732
send_term(erl_mk_int(erl_match(mk_var, term))); /* should be ok */
733
send_term(erl_mk_int(erl_match(mk_var, term2))); /* should fail */
734
erl_free_term(mk_var);
736
erl_free_term(term2);
738
/* match unbound variable against a tuple */
739
arr[0] = erl_mk_atom("madonna");
740
arr[1] = erl_mk_int(21);
741
arr[2] = erl_mk_atom("mad donna");
742
arr[3] = erl_mk_int(12);
743
mk_var = erl_mk_var("New_var");
744
term = erl_mk_tuple(arr,4);
745
send_term(erl_mk_int(erl_match(mk_var, term))); /* should be ok */
746
erl_free_term(mk_var);
748
erl_free_array(arr,4);
751
/* match (twice) unbound variable against an incorrect tuple */
752
arr[0] = erl_mk_var("New_var");
753
arr[1] = erl_mk_var("New_var");
754
arr_term[0] = erl_mk_int(17);
755
arr_term[1] = erl_mk_int(27);
756
mk_var_tuple = erl_mk_tuple(arr,2);
757
term_tuple = erl_mk_tuple(arr_term,2);
758
send_term(erl_mk_int(erl_match(mk_var_tuple, term_tuple))); /* should fail */
759
erl_free_array(arr,2);
760
erl_free_array(arr_term,2);
761
erl_free_term(mk_var_tuple);
762
erl_free_term(term_tuple);
765
/* match (twice) unbound variable against a correct tuple */
766
arr[0] = erl_mk_var("New_var");
767
arr[1] = erl_mk_var("New_var");
768
arr_term[0] = erl_mk_int(17);
769
arr_term[1] = erl_mk_int(17);
770
mk_var_tuple = erl_mk_tuple(arr,2);
771
term_tuple = erl_mk_tuple(arr_term,2);
772
send_term(erl_mk_int(erl_match(mk_var_tuple, term_tuple))); /* should be ok */
773
erl_free_array(arr,2);
774
erl_free_array(arr_term,2);
775
erl_free_term(mk_var_tuple);
776
erl_free_term(term_tuple);
783
* A basic test of erl_size().
795
/* size of a tuple */
796
tuple = erl_format("{}");
797
send_term(erl_mk_int(erl_size(tuple)));
798
erl_free_term(tuple);
800
arr[0] = erl_mk_atom("madonna");
801
arr[1] = erl_mk_int(21);
802
arr[2] = erl_mk_atom("mad donna");
803
arr[3] = erl_mk_int(12);
804
tuple = erl_mk_tuple(arr,4);
806
send_term(erl_mk_int(erl_size(tuple)));
808
erl_free_array(arr,4);
809
erl_free_term(tuple);
811
/* size of a binary */
813
bin = erl_mk_binary(string,strlen(string));
814
send_term(erl_mk_int(erl_size(bin)));
817
string = "{madonna,21,'mad donna',12}";
818
bin = erl_mk_binary(string,strlen(string));
819
send_term(erl_mk_int(erl_size(bin)));
827
* A basic test of erl_var_content().
830
TESTCASE(t_erl_var_content)
845
term = erl_mk_int(17);
846
mk_var = erl_mk_var("Var");
848
/* unbound, should return NULL */
849
if (erl_var_content(mk_var,"Var") != NULL)
850
fail("t_erl_var_content() failed");
852
erl_match(mk_var, term);
853
send_term(erl_var_content(mk_var,"Var")); /* should return 17 */
855
/* integer, should return NULL */
856
if (erl_var_content(term,"Var") != NULL)
857
fail("t_erl_var_content() failed");
859
/* unknown variable, should return NULL */
860
if (erl_var_content(mk_var,"Unknown_Var") != NULL)
861
fail("t_erl_var_content() failed");
863
erl_free_term(mk_var);
866
/* {'Madonna',21,{children,{"Name","Age"}},{"Home_page","Tel_no"}} */
867
arr4[0] = erl_mk_var("Home_page");
868
arr4[1] = erl_mk_var("Tel_no");
869
a = erl_mk_string("http://www.madonna.com");
870
erl_match(arr4[0], a);
872
arr3[0] = erl_mk_var("Name");
873
arr3[1] = erl_mk_var("Age");
875
erl_match(arr3[1], b);
877
arr2[0] = erl_mk_atom("children");
878
arr2[1] = erl_mk_tuple(arr3,2);
880
arr[0] = erl_mk_atom("Madonna");
881
arr[1] = erl_mk_int(21);
882
arr[2] = erl_mk_tuple(arr2,2);
883
arr[3] = erl_mk_tuple(arr4,2);
885
tuple = erl_mk_tuple(arr,4);
887
/* should return "http://www.madonna.com" */
888
send_term(erl_var_content(tuple,"Home_page"));
890
/* unbound, should return NULL */
891
if (erl_var_content(tuple,"Tel_no") != NULL)
892
fail("t_erl_var_content() failed");
894
/* unbound, should return NULL */
895
if (erl_var_content(tuple,"Name") != NULL)
896
fail("t_erl_var_content() failed");
898
/* should return 2 */
899
send_term(erl_var_content(tuple,"Age"));
901
erl_free_array(arr,4);
902
erl_free_array(arr2,2);
903
erl_free_array(arr3,2);
904
erl_free_array(arr4,2);
905
erl_free_term(tuple);
911
list = erl_mk_empty_list();
912
if (erl_var_content(list,"Tel_no") != NULL)
913
fail("t_erl_var_content() failed");
917
/* ['Madonna',[],{children,{"Name","Age"}},{"Home_page","Tel_no"}] */
918
arr4[0] = erl_mk_var("Home_page");
919
arr4[1] = erl_mk_var("Tel_no");
920
a = erl_mk_string("http://www.madonna.com");
921
erl_match(arr4[0], a);
923
arr3[0] = erl_mk_var("Name");
924
arr3[1] = erl_mk_var("Age");
926
erl_match(arr3[1], b);
928
arr2[0] = erl_mk_atom("children");
929
arr2[1] = erl_mk_tuple(arr3,2);
931
arr[0] = erl_mk_atom("Madonna");
932
arr[1] = erl_mk_empty_list();
933
arr[2] = erl_mk_tuple(arr2,2);
934
arr[3] = erl_mk_tuple(arr4,2);
936
list = erl_mk_list(arr,4);
938
/* should return "http://www.madonna.com" */
939
send_term(erl_var_content(list,"Home_page"));
941
/* unbound, should return NULL */
942
if (erl_var_content(list,"Tel_no") != NULL)
943
fail("t_erl_var_content() failed");
945
/* unbound, should return NULL */
946
if (erl_var_content(list,"Name") != NULL)
947
fail("t_erl_var_content() failed");
949
/* should return 2 */
950
send_term(erl_var_content(list,"Age"));
952
erl_free_array(arr,4);
953
erl_free_array(arr2,2);
954
erl_free_array(arr3,2);
955
erl_free_array(arr4,2);
965
* A basic test of erl_element().
968
TESTCASE(t_erl_element)
978
arr[0] = erl_mk_atom("madonna");
979
arr[1] = erl_mk_int(21);
980
arr[2] = erl_mk_atom("mad donna");
981
arr[3] = erl_mk_int(12);
982
tuple = erl_mk_tuple(arr,4);
984
send_term(erl_element(1,tuple));
985
send_term(erl_element(2,tuple));
986
send_term(erl_element(3,tuple));
987
send_term(erl_element(4,tuple));
989
erl_free_array(arr,4);
990
erl_free_term(tuple);
992
/* {'Madonna',21,{children,{"Isabella",2}},{'home page',"http://www.madonna.com/"} */
993
arr4[0] = erl_mk_atom("home page");
994
arr4[1] = erl_mk_string("http://www.madonna.com/");
996
arr3[0] = erl_mk_string("Isabella");
997
arr3[1] = erl_mk_int(2);
999
arr2[0] = erl_mk_atom("children");
1000
arr2[1] = erl_mk_tuple(arr3,2);
1002
arr[0] = erl_mk_atom("Madonna");
1003
arr[1] = erl_mk_int(21);
1004
arr[2] = erl_mk_tuple(arr2,2);
1005
arr[3] = erl_mk_tuple(arr4,2);
1007
tuple = erl_mk_tuple(arr,4);
1008
send_term(erl_element(1,tuple));
1009
send_term(erl_element(2,tuple));
1010
send_term(erl_element(3,tuple));
1011
send_term(erl_element(4,tuple));
1013
erl_free_term(tuple);
1014
erl_free_array(arr,4);
1015
erl_free_array(arr2,2);
1016
erl_free_array(arr3,2);
1017
erl_free_array(arr4,2);
1024
* A basic test of erl_cons().
1027
TESTCASE(t_erl_cons)
1035
anAtom = erl_mk_atom("madonna");
1036
anInt = erl_mk_int(21);
1037
list = erl_mk_empty_list();
1038
list = erl_cons(anInt, list);
1039
send_term(erl_cons(anAtom, list));
1041
erl_free_term(anAtom);
1042
erl_free_term(anInt);
1043
erl_free_compound(list);
1051
/***********************************************************************
1053
* 3. E x t r a c t i n g & i n f o f u n c t i o n s
1055
***********************************************************************/
1058
* Calculates the length of each list sent to it and sends back the result.
1061
TESTCASE(t_erl_length)
1066
ETERM* term = get_term();
1074
len_term = erl_mk_int(erl_length(term));
1075
erl_free_term(term);
1076
send_term(len_term);
1082
* Gets the head of each term and sends the result back.
1090
ETERM* term = get_term();
1098
head = erl_hd(term);
1100
erl_free_term(term);
1106
* Gets the tail of each term and sends the result back.
1114
ETERM* term = get_term();
1122
tail = erl_tl(term);
1124
erl_free_term(term);
1130
* Checks the type checking macros.
1133
TESTCASE(type_checks)
1139
atom = erl_mk_atom("an_atom");
1141
#define TYPE_CHECK(macro, term) \
1142
{ ETERM* t = term; \
1146
fail("Macro " #macro " failed on " #term); \
1150
TYPE_CHECK(ERL_IS_INTEGER, erl_mk_int(0x7FFFFFFF));
1151
#ifdef NEW_ERL_INTERFACE
1152
TYPE_CHECK(ERL_IS_UNSIGNED_INTEGER, erl_mk_uint(0x7FFFFFFF));
1154
TYPE_CHECK(ERL_IS_FLOAT, erl_mk_float(5.5));
1155
TYPE_CHECK(ERL_IS_ATOM, erl_mk_atom("another_atom"));
1157
TYPE_CHECK(ERL_IS_EMPTY_LIST, erl_mk_empty_list());
1158
TYPE_CHECK(!ERL_IS_EMPTY_LIST, erl_cons(atom, atom));
1160
#ifdef NEW_ERL_INTERFACE
1161
TYPE_CHECK(!ERL_IS_CONS, erl_mk_empty_list());
1162
TYPE_CHECK(ERL_IS_CONS, erl_cons(atom, atom));
1165
TYPE_CHECK(ERL_IS_LIST, erl_mk_empty_list());
1166
TYPE_CHECK(ERL_IS_LIST, erl_cons(atom, atom));
1168
TYPE_CHECK(ERL_IS_PID, erl_mk_pid("a@a", 42, 1, 1));
1169
TYPE_CHECK(ERL_IS_PORT, erl_mk_port("a@a", 42, 1));
1170
TYPE_CHECK(ERL_IS_REF, erl_mk_ref("a@a", 42, 1));
1172
TYPE_CHECK(ERL_IS_BINARY, erl_mk_binary("a", 1));
1173
TYPE_CHECK(ERL_IS_TUPLE, erl_mk_tuple(&atom, 1));
1176
erl_free_term(atom);
1182
* Checks the extractor macros.
1185
TESTCASE(extractor_macros)
1191
#ifdef NEW_ERL_INTERFACE
1192
#define MATCH(a, b) ((a) == (b) ? 1 : fail("bad match: " #a))
1193
#define STR_MATCH(a, b) (strcmp((a), (b)) ? fail("bad match: " #a) : 0)
1196
int anInt = 0x7FFFFFFF;
1197
t = erl_mk_int(anInt);
1198
MATCH(ERL_INT_VALUE(t), anInt);
1199
MATCH(ERL_INT_UVALUE(t), anInt);
1204
double aFloat = 3.1415;
1205
t = erl_mk_float(aFloat);
1206
MATCH(ERL_FLOAT_VALUE(t), aFloat);
1211
char* aString = "nisse";
1212
t = erl_mk_atom(aString);
1213
if (memcmp(ERL_ATOM_PTR(t), aString, strlen(aString)) != 0)
1215
MATCH(ERL_ATOM_SIZE(t), strlen(aString));
1220
char* node = "arne@strider";
1225
t = erl_mk_pid(node, number, serial, creation);
1226
STR_MATCH(ERL_PID_NODE(t), node);
1227
MATCH(ERL_PID_NUMBER(t), number);
1228
MATCH(ERL_PID_SERIAL(t), serial);
1229
MATCH(ERL_PID_CREATION(t), creation);
1234
char* node = "kalle@strider";
1238
t = erl_mk_port(node, number, creation);
1239
STR_MATCH(ERL_PORT_NODE(t), node);
1240
MATCH(ERL_PORT_NUMBER(t), number);
1241
MATCH(ERL_PORT_CREATION(t), creation);
1246
char* node = "kalle@strider";
1250
t = erl_mk_ref(node, number, creation);
1251
STR_MATCH(ERL_REF_NODE(t), node);
1252
MATCH(ERL_REF_NUMBER(t), number);
1253
MATCH(ERL_REF_CREATION(t), creation);
1260
arr[0] = erl_mk_int(51);
1261
arr[1] = erl_mk_int(52);
1262
t = erl_mk_tuple(arr, ASIZE(arr));
1263
MATCH(ERL_TUPLE_SIZE(t), ASIZE(arr));
1264
MATCH(ERL_TUPLE_ELEMENT(t, 0), arr[0]);
1265
MATCH(ERL_TUPLE_ELEMENT(t, 1), arr[1]);
1266
erl_free_array(arr, ASIZE(arr));
1271
static char bin[] = {1, 2, 3, 0, 4, 5};
1273
t = erl_mk_binary(bin, ASIZE(bin));
1274
MATCH(ERL_BIN_SIZE(t), ASIZE(bin));
1275
if (memcmp(ERL_BIN_PTR(t), bin, ASIZE(bin)) != 0)
1281
ETERM* head = erl_mk_atom("head");
1282
ETERM* tail = erl_mk_atom("tail");
1284
t = erl_cons(head, tail);
1285
MATCH(ERL_CONS_HEAD(t), head);
1286
MATCH(ERL_CONS_TAIL(t), tail);
1287
erl_free_term(head);
1288
erl_free_term(tail);
1300
/***********************************************************************
1302
* 4. I / O l i s t f u n c t i o n s
1304
***********************************************************************/
1307
* Invokes erl_iolist_length() on each term and send backs the result.
1310
TESTCASE(t_erl_iolist_length)
1315
ETERM* term = get_term();
1321
#ifndef NEW_ERL_INTERFACE
1322
fail("Function not present in this version of erl_interface");
1326
len_term = erl_mk_int(erl_iolist_length(term));
1327
erl_free_term(term);
1328
send_term(len_term);
1335
* Invokes erl_iolist_to_binary() on each term and send backs the result.
1338
TESTCASE(t_erl_iolist_to_binary)
1343
ETERM* term = get_term();
1349
#ifndef NEW_ERL_INTERFACE
1350
fail("Function not present in this version of erl_interface");
1354
new_term = erl_iolist_to_binary(term);
1356
erl_free_term(term);
1357
send_term(new_term);
1364
* Invokes erl_iolist_to_string() on each term and send backs the result.
1367
TESTCASE(t_erl_iolist_to_string)
1372
ETERM* term = get_term();
1378
#ifndef NEW_ERL_INTERFACE
1379
fail("Function not present in this version of erl_interface");
1383
result = erl_iolist_to_string(term);
1384
erl_free_term(term);
1385
if (result != NULL) {
1386
send_buffer(result, strlen(result)+1);
1397
/***********************************************************************
1399
* 5. M i s c e l l a n o u s T e s t s
1401
***********************************************************************/
1404
* Test some combinations of operations to verify that the reference pointers
1405
* are handled correctly.
1407
* "Det verkar vara lite High Chaparal med minneshanteringen i erl_interface"
1408
* Per Lundgren, ERV.
1411
TESTCASE(high_chaparal)
1413
ETERM *L1, *A1, *L2, *A2, *L3;
1417
L1 = erl_mk_empty_list();
1418
A1 = erl_mk_atom("world");
1419
L2 = erl_cons(A1, L1);
1420
A2 = erl_mk_atom("hello");
1421
L3 = erl_cons(A2, L2);
1430
/* already freed by send_term() */
1431
/* erl_free_term(L3);*/
1437
* Test erl_decode to recover from broken list data (OTP-7448)
1439
TESTCASE(broken_data)
1443
char encoded[16*1024];
1447
original = all_types();
1448
if ((n=erl_encode(original, encoded)) == 0)
1450
fail("failed to encode terms");
1454
memset(encoded+offs,0,n-offs); /* destroy */
1456
if ((new_terms = erl_decode(encoded)) != NULL)
1458
fail("decode accepted broken data");
1459
erl_free_term(new_terms);
1462
erl_free_term(original);
1467
* Returns a list containing instances of all types.
1469
* Be careful changing the contents of the list returned, because both
1470
* the build_terms() and decode_terms() test cases depend on it.
1479
static char a_binary[] = "A binary";
1481
#define CONS_AND_FREE(expr, tail) \
1483
ETERM* term = expr; \
1484
ETERM* nl = erl_cons(term, tail); \
1485
erl_free_term(term); \
1486
erl_free_term(tail); \
1490
t = erl_mk_empty_list();
1492
CONS_AND_FREE(erl_mk_atom("I am an atom"), t);
1493
CONS_AND_FREE(erl_mk_binary("A binary", sizeof(a_binary)-1), t);
1494
CONS_AND_FREE(erl_mk_float(3.0), t);
1495
CONS_AND_FREE(erl_mk_int(0), t);
1496
CONS_AND_FREE(erl_mk_int(-1), t);
1497
CONS_AND_FREE(erl_mk_int(1), t);
1499
CONS_AND_FREE(erl_mk_string("A string"), t);
1501
terms[0] = erl_mk_atom("element1");
1502
terms[1] = erl_mk_int(42);
1503
terms[2] = erl_mk_int(767);
1504
CONS_AND_FREE(erl_mk_tuple(terms, ASIZE(terms)), t);
1505
for (i = 0; i < ASIZE(terms); i++) {
1506
erl_free_term(terms[i]);
1509
CONS_AND_FREE(erl_mk_pid("kalle@localhost", 3, 2, 1), t);
1510
CONS_AND_FREE(erl_mk_pid("abcdefghijabcdefghij@localhost", 3, 2, 1), t);
1511
CONS_AND_FREE(erl_mk_port("kalle@localhost", 4, 1), t);
1512
CONS_AND_FREE(erl_mk_port("abcdefghijabcdefghij@localhost", 4, 1), t);
1513
CONS_AND_FREE(erl_mk_ref("kalle@localhost", 6, 1), t);
1514
CONS_AND_FREE(erl_mk_ref("abcdefghijabcdefghij@localhost", 6, 1), t);
1517
#undef CONS_AND_FREE
1521
* Dump (print for debugging) a term. Useful if/when things go wrong.
1524
dump_term (FILE *fp, ETERM *t)
1526
if (fp == NULL) return;
1528
fprintf(fp, "#<%p ", t);
1532
fprintf(fp, "count:%d, type:%d", ERL_COUNT(t), ERL_TYPE(t));
1537
fprintf(fp, "==undef");
1540
fprintf(fp, "==int, val:%d", ERL_INT_VALUE(t));
1543
fprintf(fp, "==uint, val:%u", ERL_INT_UVALUE(t));
1546
fprintf(fp, "==float, val:%g", ERL_FLOAT_VALUE(t));
1549
fprintf(fp, "==atom, name:%p \"%s\"",
1550
ERL_ATOM_PTR(t), ERL_ATOM_PTR(t));
1553
fprintf(fp, "==binary, data:%p,%u",
1554
ERL_BIN_PTR(t), ERL_BIN_SIZE(t));
1557
fprintf(fp, "==pid, node:%p \"%s\"",
1558
ERL_PID_NODE(t), ERL_PID_NODE(t));
1561
fprintf(fp, "==port, node:%p \"%s\"",
1562
ERL_PORT_NODE(t), ERL_PORT_NODE(t));
1565
fprintf(fp, "==ref, node:%p \"%s\"",
1566
ERL_REF_NODE(t), ERL_REF_NODE(t));
1569
fprintf(fp, "==cons");
1570
fprintf(fp, ", car:");
1571
dump_term(fp, ERL_CONS_HEAD(t));
1572
fprintf(fp, ", cdr:");
1573
dump_term(fp, ERL_CONS_TAIL(t));
1576
fprintf(fp, "==nil");
1579
fprintf(fp, "==tuple, elems:%p,%u",
1580
ERL_TUPLE_ELEMS(t), ERL_TUPLE_SIZE(t));
1583
for(i = 0; i < ERL_TUPLE_SIZE(t); i++)
1585
fprintf(fp, "elem[%u]:", i);
1586
dump_term(fp, ERL_TUPLE_ELEMENT(t, i));
1591
fprintf(fp, "==variable, name:%p \"%s\"",
1592
ERL_VAR_NAME(t), ERL_VAR_NAME(t));
1593
fprintf(fp, ", value:");
1594
dump_term(fp, ERL_VAR_VALUE(t));