/* * %CopyrightBegin% * * Copyright Ericsson AB 2001-2016. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * %CopyrightEnd% */ #include "ei_runner.h" #include #include /* * Purpose: Tests the ei_print() function. * Author: Jakob */ static void send_printed_buf(ei_x_buff* x) { char* b = NULL; char fn[256]; char *tmp = getenv("temp"); FILE* f; int n, index = 0, ver; #ifdef VXWORKS tmp = "."; #else if (tmp == NULL) { tmp = "/tmp"; } #endif strcpy(fn, tmp); strcat(fn, "/ei_print_test.txt"); f = fopen(fn, "w+"); ei_decode_version(x->buff, &index, &ver); n = ei_print_term(f, x->buff, &index); if (n < 0) { fclose(f); x->index = 0; ei_x_format(x, "~s", "ERROR: term decoding failed"); send_bin_term(x); } else { fseek(f, 0, SEEK_SET); b = malloc(n+1); fread(b, 1, n, f); b[n] = '\0'; fclose(f); x->index = 0; ei_x_format(x, "~s", b); send_bin_term(x); free(b); } } static void send_printed3(char* format, char* p1, char* p2, int fl) { char* b = NULL; char fn[100], * tmp = getenv("temp"); FILE* f; int n, index = 0, ver; ei_x_buff x; ei_x_new(&x); if (fl) { ei_x_format(&x, format, *(float*)p1, *(float*)p2); } else { ei_x_format(&x, format, p1, p2); } send_printed_buf(&x); ei_x_free(&x); } static void send_printed(char* format) { send_printed3(format, NULL, NULL, 0); } static void send_printed2(char* format, char* p) { send_printed3(format, p, NULL, 0); } static void send_printed3f(char* format, float f1, float f2) { send_printed3(format, (char*)&f1, (char*)&f2, 1); } TESTCASE(atoms) { ei_init(); send_printed("''"); send_printed("'a'"); send_printed("'A'"); send_printed("'abc'"); send_printed("'Abc'"); send_printed("'ab@c'"); send_printed("'The rain in Spain stays mainly in the plains'"); send_printed("a"); send_printed("ab"); send_printed("abc"); send_printed("ab@c"); send_printed(" abcdefghijklmnopq "); send_printed2("~a", ""); send_printed2("~a", "a"); send_printed2("~a", "A"); send_printed2("~a", "abc"); send_printed2("~a", "Abc"); send_printed2("~a", "ab@c"); send_printed2("~a", "The rain in Spain stays mainly in the plains"); send_printed2("~a", "a"); send_printed2("~a", "ab"); send_printed2("~a", "abc"); send_printed2("~a","ab@c"); send_printed2("~a", " abcdefghijklmnopq "); report(1); } TESTCASE(tuples) { ei_init(); send_printed("{}"); send_printed("{a}"); send_printed("{a, b}"); send_printed("{a, b, c}"); send_printed("{1}"); send_printed("{[]}"); send_printed("{[], []}"); send_printed("{[], a, b, c}"); send_printed("{[], a, [], b, c}"); send_printed("{[], a, '', b, c}"); report(1); } TESTCASE(lists) { ei_x_buff x; ei_init(); send_printed("[]"); send_printed("[a]"); send_printed("[a, b]"); send_printed("[a, b, c]"); send_printed("[1]"); send_printed("[[]]"); send_printed("[[], []]"); send_printed("[[], a, b, c]"); send_printed("[[], a, [], b, c]"); send_printed("[[], a, '', b, c]"); send_printed("[[x, 2], [y, 3], [z, 4]]"); /* more tests needed */ send_printed3f("[{pi, ~f}, {'cos(70)', ~f}]", (float)3.1415, (float)0.34202); send_printed3f("[[pi, ~f], ['cos(70)', ~f]]", (float)3.1415, (float)0.34202); send_printed2("[~i]", (char*)-1); report(1); } TESTCASE(strings) { ei_x_buff x; ei_init(); send_printed("\"\n\""); send_printed("\"\r\n\""); send_printed("\"a\""); send_printed("\"A\""); send_printed("\"0\""); send_printed("\"9\""); send_printed("\"The rain in Spain stays mainly in the plains\""); send_printed("\" abcdefghijklmnopq \""); report(1); } TESTCASE(maps) { ei_x_buff x; ei_init(); ei_x_new_with_version(&x); ei_x_encode_map_header(&x, 0); send_printed_buf(&x); ei_x_free(&x); ei_x_new_with_version(&x); ei_x_encode_map_header(&x, 1); ei_x_encode_atom(&x, "key"); ei_x_encode_atom(&x, "value"); send_printed_buf(&x); ei_x_free(&x); ei_x_new_with_version(&x); ei_x_encode_map_header(&x, 2); ei_x_encode_atom(&x, "key"); ei_x_encode_atom(&x, "value"); ei_x_encode_atom(&x, "another_key"); ei_x_encode_tuple_header(&x, 2); ei_x_encode_atom(&x, "ok"); ei_x_encode_long(&x, 42L); send_printed_buf(&x); ei_x_free(&x); report(1); } TESTCASE(funs) { ei_x_buff x; erlang_pid self; erlang_fun fun; strcpy(self.node, "node@host"); self.num = 9; self.serial = 99; self.creation = 1; ei_init(); ei_x_new_with_version(&x); fun.arity = -1; /* Will encode as FUN_EXT */ strcpy(fun.module, "some_module"); fun.type = EI_FUN_CLOSURE; fun.u.closure.pid = self; fun.u.closure.index = fun.u.closure.old_index = 42; fun.u.closure.uniq = 0xDEADBEEF; fun.u.closure.n_free_vars = 0; fun.u.closure.free_var_len = 0; ei_x_encode_fun(&x, &fun); send_printed_buf(&x); ei_x_free(&x); ei_x_new_with_version(&x); fun.arity = 0; /* Will encode as NEW_FUN_EXT */ strcpy(fun.module, "some_module"); fun.type = EI_FUN_CLOSURE; fun.u.closure.pid = self; fun.u.closure.index = fun.u.closure.old_index = 37; fun.u.closure.uniq = 0xBADBEEF; fun.u.closure.n_free_vars = 0; fun.u.closure.free_var_len = 0; ei_x_encode_fun(&x, &fun); send_printed_buf(&x); ei_x_free(&x); ei_x_new_with_version(&x); fun.arity = 1; strcpy(fun.module, "erlang"); fun.type = EI_FUN_EXPORT; fun.u.exprt.func = "abs"; ei_x_encode_fun(&x, &fun); send_printed_buf(&x); ei_x_free(&x); report(1); } TESTCASE(binaries) { char *buf; long len; int err, n, index; ei_x_buff x; ei_init(); for (n = 5; n; n--) { buf = read_packet(NULL); index = 0; err = ei_decode_version(buf, &index, NULL); if (err != 0) fail1("ei_decode_version returned %d", err); err = ei_decode_binary(buf, &index, NULL, &len); if (err != 0) fail1("ei_decode_binary returned %d", err); ei_x_new(&x); ei_x_append_buf(&x, buf, index); send_printed_buf(&x); ei_x_free(&x); free_packet(buf); } report(1); } TESTCASE(bitstrings) { char *buf; long len; int err, n, index; ei_x_buff x; ei_init(); for (n = 7; n; n--) { buf = read_packet(NULL); index = 0; err = ei_decode_version(buf, &index, NULL); if (err != 0) fail1("ei_decode_version returned %d", err); err = ei_decode_bitstring(buf, &index, NULL, NULL, NULL); if (err != 0) fail1("ei_decode_bitstring returned %d", err); ei_x_new(&x); ei_x_append_buf(&x, buf, index); send_printed_buf(&x); ei_x_free(&x); free_packet(buf); } report(1); }