diff options
Diffstat (limited to 'lib/compiler/test/receive_SUITE.erl')
-rw-r--r-- | lib/compiler/test/receive_SUITE.erl | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/lib/compiler/test/receive_SUITE.erl b/lib/compiler/test/receive_SUITE.erl new file mode 100644 index 0000000000..cb8833759a --- /dev/null +++ b/lib/compiler/test/receive_SUITE.erl @@ -0,0 +1,161 @@ +%% +%% %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% +%% +%%% Purpose : Compiles various modules with tough code + +-module(receive_SUITE). + +-export([all/1,init_per_testcase/2,fin_per_testcase/2, + recv/1,coverage/1,otp_7980/1]). + +-include("test_server.hrl"). + +init_per_testcase(_Case, Config) -> + ?line Dog = test_server:timetrap(test_server:minutes(2)), + [{watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) -> + Dog=?config(watchdog, Config), + test_server:timetrap_cancel(Dog), + ok. + +all(suite) -> + test_lib:recompile(?MODULE), + [recv,coverage,otp_7980]. + +-record(state, {ena = true}). + +recv(Config) when is_list(Config) -> + ?line Pid = spawn_link(fun() -> loop(#state{}) end), + Self = self(), + ?line Pid ! {Self,test}, + receive + {ok,test} -> ok; + {error,Other} -> + io:format("Got unpexected ~p", [Other]), + ?line ?t:fail() + after 10000 -> + ?line ?t:fail(no_answer) + end, + receive + X -> + io:format("Unexpected extra message: ~p", [X]), + ?line ?t:fail() + after 10 -> + ok + end, + ok. + +loop(S) -> + receive + _ when S#state.ena == false -> + loop(S); + {P,test} -> + P ! {ok,test}, + loop(S); + _X -> + loop(S) + end. + +coverage(Config) when is_list(Config) -> + do_link(self()), + do_unlink(self()), + do_monitor_node(node(), true), + do_monitor_node(node(), false), + do_group_leader(group_leader(), self()), + id(node(self())), + + erlang:'!'(self(), {a,10}), + self() ! {b,20}, + [{a,10},{b,20}] = receive_all(), + self() ! {c,42}, + receive + {c,42} -> + ok + after infinity -> + exit(cant_happen) + end, + + self() ! 17, + self() ! 19, + ?line 59 = tuple_to_values(infinity, x), + ?line 61 = tuple_to_values(999999, x), + ?line 0 = tuple_to_values(1, x), + ok. + +receive_all() -> + receive + Any -> + [Any|receive_all()] + after 0 -> + [] + end. + +do_monitor_node(Node, Bool) -> + monitor_node(Node, Bool). + +do_link(Pid) -> + link(Pid). + +do_unlink(Pid) -> + unlink(Pid). + +do_group_leader(Leader, Pid) -> + group_leader(Leader, Pid). + + +%% cover sys_core_fold:tuple_to_values/2 +tuple_to_values(infinity, X) -> + {A,B} = case X of + x -> + receive + Any -> + {42,Any} + end + end, + A+B; +tuple_to_values(Timeout, X) -> + {A,B} = case X of + x -> + receive + Any -> + {42,Any} + after Timeout -> + {0,0} + end + end, + A+B. + +%% OTP-7980. Thanks to Vincent de Phily. The following code would +%% be inccorrectly optimized by beam_jump. + +otp_7980(Config) when is_list(Config) -> + 7 = otp_7980_add_clients(10), + ok. + +otp_7980_add_clients(Count) -> + Timeout = 42, + lists:foldl(fun(_, N) -> + case N of + 1 -> ok; + _ -> receive after Timeout -> ok end + end, + N - 1 + end, Count, [1,2,3]). + +id(I) -> I. |