aboutsummaryrefslogtreecommitdiffstats
path: root/lib/erl_interface/test/ei_encode_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/erl_interface/test/ei_encode_SUITE.erl')
-rw-r--r--lib/erl_interface/test/ei_encode_SUITE.erl315
1 files changed, 315 insertions, 0 deletions
diff --git a/lib/erl_interface/test/ei_encode_SUITE.erl b/lib/erl_interface/test/ei_encode_SUITE.erl
new file mode 100644
index 0000000000..fb790eb7c3
--- /dev/null
+++ b/lib/erl_interface/test/ei_encode_SUITE.erl
@@ -0,0 +1,315 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+-module(ei_encode_SUITE).
+
+-include("test_server.hrl").
+-include("ei_encode_SUITE_data/ei_encode_test_cases.hrl").
+
+-export(
+ [
+ all/1,
+ test_ei_encode_long/1,
+ test_ei_encode_ulong/1,
+ test_ei_encode_longlong/1,
+ test_ei_encode_ulonglong/1,
+ test_ei_encode_char/1,
+ test_ei_encode_misc/1,
+ test_ei_encode_fails/1
+ ]).
+
+all(suite) ->
+ [
+ test_ei_encode_long,
+ test_ei_encode_ulong,
+ test_ei_encode_longlong,
+ test_ei_encode_ulonglong,
+ test_ei_encode_char,
+ test_ei_encode_misc,
+ test_ei_encode_fails
+ ].
+
+%% ---------------------------------------------------------------------------
+
+% NOTE: for historical reasons we don't pach as tight as we can,
+% we only fill 27 bits in 32 bit INTEGER_EXT
+
+
+%% ######################################################################## %%
+
+test_ei_encode_long(suite) -> [];
+test_ei_encode_long(Config) when is_list(Config) ->
+ ?line P = runner:start(?test_ei_encode_long),
+
+ ?line {<<97,0>> ,0} = get_buf_and_term(P),
+ ?line {<<97,255>> ,255} = get_buf_and_term(P),
+ ?line {<<98,256:32/big-signed-integer>>,256} = get_buf_and_term(P),
+ ?line {<<98,-1:32/big-signed-integer>> ,-1} = get_buf_and_term(P),
+
+ ?line {<<98, 16#07ffffff:32/big-signed-integer>>, 16#07ffffff} = get_buf_and_term(P),
+ ?line {<<98,-16#08000000:32/big-signed-integer>>,-16#08000000} = get_buf_and_term(P),
+ ?line {<<110,4,0, 0,0,0,8>> , 16#08000000} = get_buf_and_term(P),
+ ?line {<<110,4,1, 1,0,0,8>> ,-16#08000001} = get_buf_and_term(P),
+
+ ?line {<<110,4,0, 255,255,255,127>> , 16#7fffffff} = get_buf_and_term(P),
+ ?line {<<110,4,1, 0,0,0,128>> ,-16#80000000} = get_buf_and_term(P),
+
+ ?line runner:recv_eot(P),
+ ok.
+
+
+%% ######################################################################## %%
+
+test_ei_encode_ulong(suite) -> [];
+test_ei_encode_ulong(Config) when is_list(Config) ->
+ ?line P = runner:start(?test_ei_encode_ulong),
+
+ ?line {<<97,0>> ,0} = get_buf_and_term(P),
+ ?line {<<97,255>> ,255} = get_buf_and_term(P),
+ ?line {<<98,256:32/big-unsigned-integer>>,256} = get_buf_and_term(P),
+
+ ?line {<<98, 16#07ffffff:32/big-signed-integer>>,16#07ffffff} = get_buf_and_term(P),
+ ?line {<<110,4,0, 0,0,0,8>> ,16#08000000} = get_buf_and_term(P),
+
+ ?line {<<110,4,0, 255,255,255,127>> ,16#7fffffff} = get_buf_and_term(P),
+ ?line {<<110,4,0, 0,0,0,128>> ,16#80000000} = get_buf_and_term(P),
+ ?line {<<110,4,0, 255,255,255,255>> ,16#ffffffff} = get_buf_and_term(P),
+
+ ?line runner:recv_eot(P),
+ ok.
+
+
+%% ######################################################################## %%
+
+test_ei_encode_longlong(suite) -> [];
+test_ei_encode_longlong(Config) when is_list(Config) ->
+ case os:type() of
+ vxworks ->
+ {skip,"Skipped on VxWorks"};
+ _ ->
+ ?line P = runner:start(?test_ei_encode_longlong),
+
+ ?line {<<97,0>> ,0} = get_buf_and_term(P),
+ ?line {<<97,255>> ,255} = get_buf_and_term(P),
+ ?line {<<98,256:32/big-signed-integer>>,256} = get_buf_and_term(P),
+ ?line {<<98,-1:32/big-signed-integer>> ,-1} = get_buf_and_term(P),
+
+ ?line {<<98, 16#07ffffff:32/big-signed-integer>>, 16#07ffffff} = get_buf_and_term(P),
+ ?line {<<98,-16#08000000:32/big-signed-integer>>,-16#08000000} = get_buf_and_term(P),
+ ?line {<<110,4,0, 0,0,0,8>> , 16#08000000} = get_buf_and_term(P),
+ ?line {<<110,4,1, 1,0,0,8>> ,-16#08000001} = get_buf_and_term(P),
+
+ ?line {<<110,4,0, 255,255,255,127>> , 16#7fffffff} = get_buf_and_term(P),
+ ?line {<<110,4,1, 0,0,0,128>> ,-16#80000000} = get_buf_and_term(P),
+ ?line {<<110,6,0, 255,255,255,255,255,127>> , 16#7fffffffffff} = get_buf_and_term(P),
+ ?line {<<110,6,1, 0,0,0,0,0,128>> ,-16#800000000000} = get_buf_and_term(P),
+ ?line {<<110,8,0, 255,255,255,255,255,255,255,127>>,16#7fffffffffffffff} = get_buf_and_term(P),
+ ?line {<<110,8,1, 0,0,0,0,0,0,0,128>> ,-16#8000000000000000} = get_buf_and_term(P),
+
+ ?line runner:recv_eot(P),
+ ok
+ end.
+
+
+%% ######################################################################## %%
+
+test_ei_encode_ulonglong(suite) -> [];
+test_ei_encode_ulonglong(Config) when is_list(Config) ->
+ case os:type() of
+ vxworks ->
+ {skip,"Skipped on VxWorks"};
+ _ ->
+ ?line P = runner:start(?test_ei_encode_ulonglong),
+
+ ?line {<<97,0>> ,0} = get_buf_and_term(P),
+ ?line {<<97,255>> ,255} = get_buf_and_term(P),
+ ?line {<<98,256:32/big-unsigned-integer>>,256} = get_buf_and_term(P),
+
+ ?line {<<98, 16#07ffffff:32/big-signed-integer>>,16#07ffffff} = get_buf_and_term(P),
+ ?line {<<110,4,0, 0,0,0,8>> ,16#08000000} = get_buf_and_term(P),
+
+ ?line {<<110,4,0, 255,255,255,127>> ,16#7fffffff} = get_buf_and_term(P),
+ ?line {<<110,4,0, 0,0,0,128>> ,16#80000000} = get_buf_and_term(P),
+ ?line {<<110,4,0, 255,255,255,255>> ,16#ffffffff} = get_buf_and_term(P),
+ ?line {<<110,6,0, 255,255,255,255,255,255>>,16#ffffffffffff} = get_buf_and_term(P),
+ ?line {<<110,8,0, 255,255,255,255,255,255,255,255>>,16#ffffffffffffffff} = get_buf_and_term(P),
+
+ ?line runner:recv_eot(P),
+ ok
+ end.
+
+
+%% ######################################################################## %%
+%% A "character" for us is an 8 bit integer, alwasy positive, i.e.
+%% it is unsigned.
+%% FIXME maybe the API should change to use "unsigned char" to be clear?!
+
+test_ei_encode_char(suite) -> [];
+test_ei_encode_char(Config) when is_list(Config) ->
+ ?line P = runner:start(?test_ei_encode_char),
+
+ ?line {<<97, 0>>,0} = get_buf_and_term(P),
+ ?line {<<97,127>>,16#7f} = get_buf_and_term(P),
+ ?line {<<97,255>>,16#ff} = get_buf_and_term(P),
+
+ ?line runner:recv_eot(P),
+ ok.
+
+
+%% ######################################################################## %%
+
+test_ei_encode_misc(suite) -> [];
+test_ei_encode_misc(Config) when is_list(Config) ->
+ ?line P = runner:start(?test_ei_encode_misc),
+
+ ?line <<131>> = get_binaries(P),
+
+% ?line {term,F} = get_term(P),
+% ?line match_float(F, 0.0),
+% ?line {term,F} = get_term(P),
+% ?line match_float(F, 0.0),
+
+% ?line {term,F} = get_term(P),
+% ?line true = match_float(F, -1.0),
+% ?line {term,F} = get_term(P),
+% ?line true = match_float(F, -1.0),
+
+% ?line {term,F} = get_term(P),
+% ?line true = match_float(F, 1.0),
+% ?line {term,F} = get_term(P),
+% ?line true = match_float(F, 1.0),
+
+ ?line {<<100,0,5,"false">>,false} = get_buf_and_term(P),
+ ?line {<<100,0,4,"true">> ,true} = get_buf_and_term(P),
+ ?line {<<100,0,4,"true">> ,true} = get_buf_and_term(P),
+ ?line {<<100,0,4,"true">> ,true} = get_buf_and_term(P),
+
+ ?line {<<100,0,3,"foo">>,foo} = get_buf_and_term(P),
+ ?line {<<100,0,3,"foo">>,foo} = get_buf_and_term(P),
+ ?line {<<100,0,0,"">>,''} = get_buf_and_term(P),
+ ?line {<<100,0,0,"">>,''} = get_buf_and_term(P),
+ ?line {<<100,0,6,"������">>,'������'} = get_buf_and_term(P),
+ ?line {<<100,0,6,"������">>,'������'} = get_buf_and_term(P),
+
+ ?line {<<107,0,3,"foo">>,"foo"} = get_buf_and_term(P),
+ ?line {<<107,0,3,"foo">>,"foo"} = get_buf_and_term(P),
+ ?line {<<106>>,""} = get_buf_and_term(P),
+ ?line {<<106>>,""} = get_buf_and_term(P),
+ ?line {<<107,0,6,"������">>,"������"} = get_buf_and_term(P),
+ ?line {<<107,0,6,"������">>,"������"} = get_buf_and_term(P),
+
+ ?line {<<109,0,0,0,3,"foo">>,<<"foo">>} = get_buf_and_term(P),
+ ?line {<<109,0,0,0,0,"">>,<<>>} = get_buf_and_term(P),
+ ?line {<<109,0,0,0,6,"������">>,<<"������">>} = get_buf_and_term(P),
+
+ ?line {<<104,0>>,{}} = get_buf_and_term(P), % Tuple header for {}
+ ?line {<<106>>,[]} = get_buf_and_term(P), % Empty list []
+
+ ?line runner:recv_eot(P),
+ ok.
+
+
+%% ######################################################################## %%
+
+test_ei_encode_fails(suite) -> [];
+test_ei_encode_fails(Config) when is_list(Config) ->
+ ?line P = runner:start(?test_ei_encode_fails),
+
+ ?line XAtom = list_to_atom(lists:duplicate(255, $x)),
+ ?line YAtom = list_to_atom(lists:duplicate(255, $y)),
+
+ ?line XAtom = get_term(P),
+ ?line XAtom = get_term(P),
+ ?line YAtom = get_term(P),
+ ?line YAtom = get_term(P),
+
+ ?line {{{{}}}} = get_term(P),
+
+ ?line runner:recv_eot(P),
+ ok.
+
+
+%% ######################################################################## %%
+
+% We read two packets for each test, the ei_encode and ei_x_encode version....
+
+get_buf_and_term(P) ->
+ B = get_binaries(P),
+ case B of
+ <<131>> ->
+ io:format("(got single magic, no content)\n",[]),
+ {B,'$$magic$$'};
+ <<131,_>> ->
+ T = binary_to_term(B),
+ io:format("~w\n~w\n(got magic)\n",[B,T]),
+ {B,T};
+ _ ->
+ B1 = list_to_binary([131,B]), % No magic, add
+ T = binary_to_term(B1),
+ io:format("~w\n~w\n(got no magic)\n",[B,T]),
+ {B,T}
+ end.
+
+
+get_binaries(P) ->
+ B1 = get_binary(P),
+ B2 = get_binary(P),
+ B1 = B2.
+
+get_binary(P) ->
+ case runner:get_term(P) of
+ {bytes,L} ->
+ B = list_to_binary(L),
+ io:format("~w\n",[L]),
+% For strange reasons <<131>> show up as <>....
+% io:format("~w\n",[B]),
+ B;
+ Other ->
+ Other
+ end.
+
+%%
+
+% We use our own get_term()
+
+get_term(P) ->
+ case runner:get_term(P) of
+ {bytes,[131]} ->
+ io:format("(got single magic, no content)\n",[]),
+ '$$magic$$';
+ {bytes,[131,L]} ->
+ B = list_to_binary(L),
+ T = binary_to_term(B),
+ io:format("~w\n~w\n(got magic)\n",[L,T]),
+ T;
+ {bytes,L} ->
+ B = list_to_binary([131,L]),
+ T = binary_to_term(B),
+ io:format("~w\n~w\n(got no magic)\n",[L,T]),
+ T;
+ Other ->
+ Other
+ end.
+
+%%
+
+match_float(F, Match) when is_float(F), F > Match*0.99, F < Match*1.01 ->
+ true.
+