diff options
Diffstat (limited to 'lib/stdlib/test/gen_event_SUITE.erl')
-rw-r--r-- | lib/stdlib/test/gen_event_SUITE.erl | 846 |
1 files changed, 846 insertions, 0 deletions
diff --git a/lib/stdlib/test/gen_event_SUITE.erl b/lib/stdlib/test/gen_event_SUITE.erl new file mode 100644 index 0000000000..dc5ddebf53 --- /dev/null +++ b/lib/stdlib/test/gen_event_SUITE.erl @@ -0,0 +1,846 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1996-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(gen_event_SUITE). + +-include("test_server.hrl"). + +-export([all/1]). +-export([start/1, test_all/1, add_handler/1, add_sup_handler/1, + delete_handler/1, swap_handler/1, swap_sup_handler/1, + notify/1, sync_notify/1, call/1, info/1, hibernate/1]). + +all(suite) -> {req, [stdlib], [start, test_all, hibernate]}. + +%% -------------------------------------- +%% Start an event manager. +%% -------------------------------------- + +start(doc) -> []; +start(suite) -> []; +start(Config) when list(Config) -> + OldFl = process_flag(trap_exit, true), + + ?line {ok, Pid0} = gen_event:start(), %anonymous + ?line [] = gen_event:which_handlers(Pid0), + ?line ok = gen_event:stop(Pid0), + + ?line {ok, Pid1} = gen_event:start_link(), %anonymous + ?line [] = gen_event:which_handlers(Pid1), + ?line ok = gen_event:stop(Pid1), + + ?line {ok, Pid2} = gen_event:start({local, my_dummy_name}), + ?line [] = gen_event:which_handlers(my_dummy_name), + ?line [] = gen_event:which_handlers(Pid2), + ?line ok = gen_event:stop(my_dummy_name), + + ?line {ok, Pid3} = gen_event:start_link({local, my_dummy_name}), + ?line [] = gen_event:which_handlers(my_dummy_name), + ?line [] = gen_event:which_handlers(Pid3), + ?line ok = gen_event:stop(my_dummy_name), + + ?line {ok, Pid4} = gen_event:start_link({global, my_dummy_name}), + ?line [] = gen_event:which_handlers({global, my_dummy_name}), + ?line [] = gen_event:which_handlers(Pid4), + ?line ok = gen_event:stop({global, my_dummy_name}), + + ?line {ok, _} = gen_event:start_link({local, my_dummy_name}), + ?line {error, {already_started, _}} = + gen_event:start_link({local, my_dummy_name}), + ?line {error, {already_started, _}} = + gen_event:start({local, my_dummy_name}), + ?line ok = gen_event:stop(my_dummy_name), + + ?line {ok, Pid5} = gen_event:start_link({global, my_dummy_name}), + ?line {error, {already_started, _}} = + gen_event:start_link({global, my_dummy_name}), + ?line {error, {already_started, _}} = + gen_event:start({global, my_dummy_name}), + + exit(Pid5, shutdown), + receive + {'EXIT', Pid5, shutdown} -> ok + after 10000 -> + ?t:fail(exit_gen_event) + end, + + ?t:messages_get(), + process_flag(trap_exit, OldFl), + ok. + + +hibernate(suite) -> []; +hibernate(Config) when is_list(Config) -> + ?line {ok,Pid} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line true = gen_event:call(my_dummy_handler, dummy_h, hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line later = gen_event:call(my_dummy_handler, dummy_h, hibernate_later), + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line receive after 2000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line gen_event:notify(my_dummy_handler,hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line gen_event:notify(my_dummy_handler,wakeup), + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line gen_event:notify(my_dummy_handler,hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line gen_event:sync_notify(my_dummy_handler,wakeup), + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line ok = gen_event:sync_notify(my_dummy_handler,hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy1_h, [self()]), + ?line [_,_] = gen_event:which_handlers(my_dummy_handler), + ?line gen_event:notify(my_dummy_handler,hibernate), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line gen_event:notify(my_dummy_handler,wakeup), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line Pid ! gnurf, + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! sleep, + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid,current_function), + ?line Pid ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid,current_function)), + ?line ok = gen_event:stop(my_dummy_handler), + ?line {ok,Pid2} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self(),hibernate]), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid2,current_function), + ?line sys:suspend(my_dummy_handler), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid2,current_function), + ?line sys:resume(my_dummy_handler), + ?line receive after 1000 -> ok end, + ?line {current_function,{erlang,hibernate,3}} = erlang:process_info(Pid2,current_function), + ?line Pid2 ! wake, + ?line receive after 1000 -> ok end, + ?line true = ({current_function,{erlang,hibernate,3}} =/= + erlang:process_info(Pid2,current_function)), + + + ?line ok = gen_event:stop(my_dummy_handler), + + ok. + + +test_all(suite) -> [add_handler, add_sup_handler, delete_handler, + swap_handler, swap_sup_handler, notify, + sync_notify, call, info]. + +add_handler(doc) -> []; +add_handler(suite) -> []; +add_handler(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line {error, my_error} = + gen_event:add_handler(my_dummy_handler, dummy_h, make_error), + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + + ?line {error, my_error} = + gen_event:add_handler(my_dummy_handler, {dummy_h, self()}, make_error), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,self()}, + [self()]), + Self = self(), + ?line [{dummy_h, Self}, dummy_h] = + gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +add_sup_handler(doc) -> []; +add_sup_handler(suite) -> []; +add_sup_handler(Config) when list(Config) -> + ?line {ok,Pid} = gen_event:start({local, my_dummy_handler}), + ?line {error, my_error} = + gen_event:add_sup_handler(my_dummy_handler, dummy_h, make_error), + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line exit(Pid, sup_died), + ?t:sleep(1000), + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + + ?line {error, my_error} = + gen_event:add_handler(my_dummy_handler, {dummy_h, self()}, make_error), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, {dummy_h,self()}, + [self()]), + Self = self(), + ?line [{dummy_h, Self}, dummy_h] = + gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:stop(my_dummy_handler), + + ?line receive + {gen_event_EXIT, dummy_h, shutdown} -> + ok + after 1000 -> + ?t:fail({no,{gen_event_EXIT, dummy_h, shutdown}}) + end, + + ?line receive + {gen_event_EXIT, {dummy_h,Self}, shutdown} -> + ok + after 1000 -> + ?t:fail({no,{gen_event_EXIT, {dummy_h,Self}, + shutdown}}) + end, + ok. + +delete_handler(doc) -> []; +delete_handler(suite) -> []; +delete_handler(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line {error, module_not_found} = + gen_event:delete_handler(my_dummy_handler, duuuuuuuuumy, []), + ?line return_hej = + gen_event:delete_handler(my_dummy_handler, dummy_h, return_hej), + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = + gen_event:delete_handler(my_dummy_handler, dummy_h, []), + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,2}, [self()]), + ?line {error, module_not_found} = + gen_event:delete_handler(my_dummy_handler, {duuuuuuuuumy,1}, []), + ?line return_hej = + gen_event:delete_handler(my_dummy_handler, {dummy_h,1}, return_hej), + ?line return_hej = + gen_event:delete_handler(my_dummy_handler, {dummy_h,2}, return_hej), + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,2}, [self()]), + ?line ok = + gen_event:delete_handler(my_dummy_handler, {dummy_h,2}, []), + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +swap_handler(doc) -> []; +swap_handler(suite) -> []; +swap_handler(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line {error, non_existing} = + gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, + {dummy1_h, []}), + ?line ok = + gen_event:swap_handler(my_dummy_handler, {dummy_h, swap}, + {dummy1_h, swap}), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:delete_handler(my_dummy_handler, dummy1_h, []), + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + ?line {error, non_existing} = + gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, + {dummy1_h, []}), + ?line ok = + gen_event:swap_handler(my_dummy_handler, {{dummy_h,3}, swap}, + {{dummy1_h,4}, swap}), + ?line [{dummy1_h,4}] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:delete_handler(my_dummy_handler, {dummy1_h,4}, []), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +swap_sup_handler(doc) -> []; +swap_sup_handler(suite) -> []; +swap_sup_handler(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line {error, non_existing} = + gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, + {dummy1_h, []}), + ?line ok = + gen_event:swap_handler(my_dummy_handler, {dummy_h, swap}, + {dummy1_h, swap}), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:delete_handler(my_dummy_handler, dummy1_h, []), + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + after 1000 -> + ?t:fail({no,{gen_event_EXIT, dummy1_h, normal}}) + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, {dummy_h,3}, + [self()]), + ?line {error, non_existing} = + gen_event:swap_sup_handler(my_dummy_handler, {faulty_h, swap}, + {dummy1_h, []}), + ?line ok = + gen_event:swap_sup_handler(my_dummy_handler, {{dummy_h,3}, swap}, + {{dummy1_h,4}, swap}), + ?line [{dummy1_h,4}] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:delete_handler(my_dummy_handler, {dummy1_h,4}, []), + ?line receive + {gen_event_EXIT, {dummy1_h,4}, normal} -> + ok + after 1000 -> + ?t:fail({no,{gen_event_EXIT, {dummy1_h,4}, normal}}) + end, + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +notify(doc) -> []; +notify(suite) -> []; +notify(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + Event = {event, self()}, + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + ?line ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy1_h, Event} -> + ok + end, + ?line ok = gen_event:notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line ok = gen_event:notify(my_dummy_handler, error_event), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Handler with id, {Mod,Id} + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,5}, [self()]), + ?line [{dummy_h,5}] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + ?line ok = gen_event:notify(my_dummy_handler, + {swap_event, {dummy1_h, 9}, swap}), + ?t:sleep(1000), + ?line [{dummy1_h,9}] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy1_h, Event} -> + ok + end, + ?line ok = gen_event:notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,a}, [self()]), + + ?line ok = gen_event:notify(my_dummy_handler, error_event), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Supervised handler. + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + + ?line ok = gen_event:notify(my_dummy_handler, do_crash), + ?line receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:notify(my_dummy_handler, do_crash), + ?line receive + {gen_event_EXIT, dummy1_h, {'EXIT',_}} -> + ok + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +sync_notify(doc) -> []; +sync_notify(suite) -> []; +sync_notify(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + Event = {event, self()}, + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + ?line ok = gen_event:sync_notify(my_dummy_handler, + {swap_event, dummy1_h, swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy1_h, Event} -> + ok + end, + ?line ok = gen_event:sync_notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line ok = gen_event:sync_notify(my_dummy_handler, error_event), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Handler with id, {Mod,Id} + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,5}, [self()]), + ?line [{dummy_h,5}] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + ?line ok = gen_event:sync_notify(my_dummy_handler, + {swap_event, {dummy1_h, 9}, swap}), + ?t:sleep(1000), + ?line [{dummy1_h,9}] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy1_h, Event} -> + ok + end, + ?line ok = gen_event:sync_notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,a}, [self()]), + + ?line ok = gen_event:sync_notify(my_dummy_handler, error_event), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Supervised handler. + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:sync_notify(my_dummy_handler, Event), + ?line receive + {dummy_h, Event} -> + ok + end, + + ?line ok = gen_event:sync_notify(my_dummy_handler, do_crash), + ?line receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:sync_notify(my_dummy_handler, + {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:sync_notify(my_dummy_handler, do_crash), + ?line receive + {gen_event_EXIT, dummy1_h, {'EXIT',_}} -> + ok + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:sync_notify(my_dummy_handler, + {swap_event,dummy1_h,swap}), + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:sync_notify(my_dummy_handler, delete_event), + ?line receive + {dummy1_h, removed} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +call(doc) -> []; +call(suite) -> []; +call(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h, 1}, [self()]), + ?line [{dummy_h, 1}, dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line {'EXIT',_} = (catch gen_event:call(non_exist, dummy_h, hejsan)), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, bad_h, hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, {dummy_h, 1}, + hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan, + 10000), + ?line {'EXIT', {timeout, _}} = + (catch gen_event:call(my_dummy_handler, dummy_h, hejsan, 0)), + flush(), + ?line ok = gen_event:delete_handler(my_dummy_handler, {dummy_h, 1}, []), + ?line {ok, swapped} = gen_event:call(my_dummy_handler, dummy_h, + {swap_call,dummy1_h,swap}), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line ok = gen_event:call(my_dummy_handler, dummy1_h, delete_call), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line {error, {return, faulty}} = + gen_event:call(my_dummy_handler, dummy_h, error_call), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line {error, {'EXIT', _}} = + gen_event:call(my_dummy_handler, dummy_h, exit_call), + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Handler with id, {Mod,Id} + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + ?line [{dummy_h,1}] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, bad_h, hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, {dummy_h,1}, + hejsan), + ?line {ok, swapped} = gen_event:call(my_dummy_handler, {dummy_h,1}, + {swap_call,{dummy1_h,2},swap}), + ?line [{dummy1_h,2}] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line ok = gen_event:call(my_dummy_handler, {dummy1_h,2}, delete_call), + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + + ?line {error, {return, faulty}} = + gen_event:call(my_dummy_handler, {dummy_h,3}, error_call), + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,4}, [self()]), + + ?line {error, {'EXIT', _}} = + gen_event:call(my_dummy_handler, {dummy_h,4}, exit_call), + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Supervised handler. + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, bad_h, hejsan), + ?line {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line {ok, swapped} = gen_event:call(my_dummy_handler, dummy_h, + {swap_call,dummy1_h,swap}), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line {error, bad_module} = + gen_event:call(my_dummy_handler, dummy_h, hejsan), + ?line ok = gen_event:call(my_dummy_handler, dummy1_h, delete_call), + ?line receive + {dummy1_h, removed} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + + ?line {error, {return, faulty}} = + gen_event:call(my_dummy_handler, dummy_h, error_call), + ?line receive + {dummy_h, returned_error} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy_h, {return,faulty}} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy_h, {return,faulty}}}) + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + + ?line {error, {'EXIT', _}} = + gen_event:call(my_dummy_handler, dummy_h, exit_call), + + ?line receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy_h, {'EXIT','_'}}}) + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. + +flush() -> + receive _ -> flush() after 0 -> ok end. + +info(doc) -> []; +info(suite) -> []; +info(Config) when list(Config) -> + ?line {ok,_} = gen_event:start({local, my_dummy_handler}), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + Info = {info, self()}, + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy_h, Info} -> + ok + end, + ?line my_dummy_handler ! {swap_info,dummy1_h,swap}, + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy1_h, Info} -> + ok + end, + ?line my_dummy_handler ! delete_info, + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ?line my_dummy_handler ! error_info, + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Handler with id, {Mod,Id} + + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + ?line [{dummy_h,1}] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy_h, Info} -> + ok + end, + ?line my_dummy_handler ! {swap_info,{dummy1_h,2},swap}, + ?t:sleep(1000), + ?line [{dummy1_h,2}] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy1_h, Info} -> + ok + end, + ?line my_dummy_handler ! delete_info, + ?line receive + {dummy1_h, removed} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + ?line ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + + ?line my_dummy_handler ! error_info, + ?line receive + {dummy_h, returned_error} -> + ok + end, + ?line [] = gen_event:which_handlers(my_dummy_handler), + + %% Supervised handler + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy_h, Info} -> + ok + end, + ?line my_dummy_handler ! {swap_info,dummy1_h,swap}, + ?t:sleep(1000), + ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ?line my_dummy_handler ! Info, + ?line receive + {dummy1_h, Info} -> + ok + end, + ?line my_dummy_handler ! delete_info, + ?line receive + {dummy1_h, removed} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy1_h, normal}}) + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + + ?line my_dummy_handler ! error_info, + ?line receive + {dummy_h, returned_error} -> + ok + end, + + ?line receive + {gen_event_EXIT, dummy_h, {return,faulty}} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy_h, {return,faulty}}}) + end, + + ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ?line my_dummy_handler ! do_crash, + + ?line receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + after 1000 -> + ?t:fail({no, {gen_event_EXIT, dummy_h, {'EXIT','_'}}}) + end, + + ?line [] = gen_event:which_handlers(my_dummy_handler), + + ?line ok = gen_event:stop(my_dummy_handler), + ok. |