aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/test/beam_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/test/beam_SUITE.erl')
-rw-r--r--erts/emulator/test/beam_SUITE.erl281
1 files changed, 281 insertions, 0 deletions
diff --git a/erts/emulator/test/beam_SUITE.erl b/erts/emulator/test/beam_SUITE.erl
new file mode 100644
index 0000000000..cc1626630b
--- /dev/null
+++ b/erts/emulator/test/beam_SUITE.erl
@@ -0,0 +1,281 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1998-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(beam_SUITE).
+
+-export([all/1, packed_registers/1, apply_last/1, apply_last_bif/1,
+ buildo_mucho/1, heap_sizes/1, big_lists/1]).
+
+-export([applied/2]).
+
+-include("test_server.hrl").
+
+all(suite) ->
+ [packed_registers, apply_last, apply_last_bif, buildo_mucho,
+ heap_sizes, big_lists].
+
+
+%% Verify that apply(M, F, A) is really tail recursive.
+apply_last(Config) when is_list(Config) ->
+ Pid=spawn(?MODULE, applied, [self(), 10000]),
+ Size =
+ receive
+ {Pid, finished} ->
+ stack_size(Pid)
+ after 30000 ->
+ ?t:fail("applied/2 timed out.")
+ end,
+ Pid ! die,
+ ?t:format("Size: ~p~n", [Size]),
+ if
+ Size < 700 ->
+ ok;
+ true ->
+ ?t:fail("10000 apply() grew stack too much.")
+ end,
+ ok.
+
+stack_size(Pid) ->
+ {heap_size, HS}=process_info(Pid, heap_size),
+ {stack_size,SS}=process_info(Pid, stack_size),
+ HS+SS.
+
+applied(Starter, 0) ->
+ Starter ! {self(), finished},
+ receive
+ die ->
+ ok
+ end,
+ ok;
+applied(Starter, N) ->
+ apply(?MODULE, applied, [Starter, N-1]).
+
+%% Verify that tail-recursive use of apply(M,F,A) on a Bif works."
+apply_last_bif(Config) when is_list(Config) ->
+ apply(erlang, abs, [1]).
+
+%% Test three high register numbers in a put_list instruction
+%% (to test whether packing works properly).
+packed_registers(Config) when is_list(Config) ->
+ ?line PrivDir = ?config(priv_dir, Config),
+ ?line Mod = packed_regs,
+ ?line Name = filename:join(PrivDir, atom_to_list(Mod) ++ ".erl"),
+
+ %% Generate a module which generates a list of tuples.
+ %% put_list(A) -> [{A, 600}, {A, 999}, ... {A, 0}].
+ ?line Code = gen_packed_regs(600, ["-module("++atom_to_list(Mod)++").\n",
+ "-export([put_list/1]).\n",
+ "put_list(A) ->\n["]),
+ ?line ok = file:write_file(Name, Code),
+
+ %% Compile the module.
+ ?line io:format("Compiling: ~s\n", [Name]),
+ ?line CompRc = compile:file(Name, [{outdir, PrivDir}, report]),
+ ?line io:format("Result: ~p\n",[CompRc]),
+ ?line {ok, Mod} = CompRc,
+
+ %% Load it.
+ ?line io:format("Loading...\n",[]),
+ ?line LoadRc = code:load_abs(filename:join(PrivDir, atom_to_list(Mod))),
+ ?line {module,_Module} = LoadRc,
+
+ %% Call it and verify result.
+ ?line Term = {a, b},
+ ?line L = Mod:put_list(Term),
+ ?line verify_packed_regs(L, Term, 600),
+ ok.
+
+gen_packed_regs(0, Acc) ->
+ [Acc|"{A,0}].\n"];
+gen_packed_regs(N, Acc) ->
+ gen_packed_regs(N-1, [Acc,"{A,",integer_to_list(N)|"},\n"]).
+
+verify_packed_regs([], _, -1) -> ok;
+verify_packed_regs([{Term, N}| T], Term, N) ->
+ verify_packed_regs(T, Term, N-1);
+verify_packed_regs(L, Term, N) ->
+ ?line ok = io:format("Expected [{~p, ~p}|T]; got\n~p\n", [Term, N, L]),
+ ?line test_server:fail().
+
+buildo_mucho(Config) when is_list(Config) ->
+ ?line buildo_mucho_1(),
+ ok.
+
+buildo_mucho_1() ->
+ %% Thanks to Per Gustafsson, HiPE.
+ [{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},
+ {<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1},{<<>>,1}].
+
+heap_sizes(Config) when is_list(Config) ->
+ ?line Sizes = erlang:system_info(heap_sizes),
+ ?line io:format("~p heap sizes\n", [length(Sizes)]),
+ ?line io:format("~p\n", [Sizes]),
+
+ %% Verify that heap sizes increase monotonically.
+ ?line Largest = lists:foldl(fun(E, P) when is_integer(P), E > P -> E;
+ (E, []) -> E
+ end, [], Sizes),
+
+ %% Verify that the largest heap size consists of 31 or 63 bits.
+ ?line
+ case Largest bsr (erlang:system_info(wordsize)*8-2) of
+ R when R > 0 -> ok
+ end,
+ ok.
+
+%% Thanks to Igor Goryachev.
+
+big_lists(Config) when is_list(Config) ->
+ b(),
+ ok.
+
+a() ->
+ {selected,
+ ["uid",
+ "nickname",
+ "n_family",
+ "n_given",
+ "email_pref",
+ "tel_home_number",
+ "tel_cellular_number",
+ "adr_home_country",
+ "adr_home_locality",
+ "adr_home_region",
+ "url",
+ "gender",
+ "bday",
+ "constitution",
+ "height",
+ "weight",
+ "hair",
+ "routine",
+ "smoke",
+ "maritalstatus",
+ "children",
+ "independence",
+ "school_number",
+ "school_locality",
+ "school_title",
+ "school_period",
+ "org_orgname",
+ "title",
+ "adr_work_locality",
+ "photo_type",
+ "photo_binval"],
+ [{"test"}]}.
+
+b() ->
+ case a() of
+ {selected,
+ ["uid",
+ "nickname",
+ "n_family",
+ "n_given",
+ "email_pref",
+ "tel_home_number",
+ "tel_cellular_number",
+ "adr_home_country",
+ "adr_home_locality",
+ "adr_home_region",
+ "url",
+ "gender",
+ "bday",
+ "constitution",
+ "height",
+ "weight",
+ "hair",
+ "routine",
+ "smoke",
+ "maritalstatus",
+ "children",
+ "independence",
+ "school_number",
+ "school_locality",
+ "school_title",
+ "school_period",
+ "org_orgname",
+ "title",
+ "adr_work_locality",
+ "photo_type",
+ "photo_binval"],
+ _} ->
+ ok
+ end.