diff options
Diffstat (limited to 'lib/stdlib/test/gen_event_SUITE.erl')
-rw-r--r-- | lib/stdlib/test/gen_event_SUITE.erl | 1537 |
1 files changed, 866 insertions, 671 deletions
diff --git a/lib/stdlib/test/gen_event_SUITE.erl b/lib/stdlib/test/gen_event_SUITE.erl index 7a6fcba4e5..880b10117c 100644 --- a/lib/stdlib/test/gen_event_SUITE.erl +++ b/lib/stdlib/test/gen_event_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2014. All Rights Reserved. +%% Copyright Ericsson AB 1996-2017. 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. @@ -19,28 +19,37 @@ %% -module(gen_event_SUITE). --include_lib("test_server/include/test_server.hrl"). +-include_lib("common_test/include/ct.hrl"). --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, - init_per_group/2,end_per_group/2]). +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, + init_per_group/2,end_per_group/2, init_per_testcase/2, + end_per_testcase/2]). -export([start/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, + notify/1, sync_notify/1, call/1, info/1, hibernate/1, auto_hibernate/1, call_format_status/1, call_format_status_anon/1, - error_format_status/1, get_state/1, replace_state/1]). + error_format_status/1, get_state/1, replace_state/1, + start_opt/1, + undef_init/1, undef_handle_call/1, undef_handle_event/1, + undef_handle_info/1, undef_code_change/1, undef_terminate/1, + undef_in_terminate/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. -all() -> - [start, {group, test_all}, hibernate, +all() -> + [start, {group, test_all}, hibernate, auto_hibernate, call_format_status, call_format_status_anon, error_format_status, - get_state, replace_state]. + get_state, replace_state, + start_opt, {group, undef_callbacks}, undef_in_terminate]. -groups() -> +groups() -> [{test_all, [], [add_handler, add_sup_handler, delete_handler, swap_handler, swap_sup_handler, notify, sync_notify, - call, info]}]. + call, info]}, + {undef_callbacks, [], + [undef_init, undef_handle_call, undef_handle_event, undef_handle_info, + undef_code_change, undef_terminate]}]. init_per_suite(Config) -> Config. @@ -48,89 +57,188 @@ init_per_suite(Config) -> end_per_suite(_Config) -> ok. +init_per_group(undef_callbacks, Config) -> + DataDir = ?config(data_dir, Config), + Event1 = filename:join(DataDir, "oc_event.erl"), + {ok, oc_event} = compile:file(Event1), + Config; init_per_group(_GroupName, Config) -> Config. end_per_group(_GroupName, Config) -> Config. +init_per_testcase(Case, Config) when Case == undef_handle_call; + Case == undef_handle_info; + Case == undef_handle_event; + Case == undef_code_change; + Case == undef_terminate -> + {ok, Pid} = oc_event:start(), + [{event_pid, Pid}|Config]; +init_per_testcase(undef_init, Config) -> + {ok, Pid} = gen_event:start({local, oc_init_event}), + [{event_pid, Pid}|Config]; +init_per_testcase(_Case, Config) -> + Config. + +end_per_testcase(Case, Config) when Case == undef_init; + Case == undef_handle_call; + Case == undef_handle_info; + Case == undef_handle_event; + Case == undef_code_change; + Case == undef_terminate -> + Pid = ?config(event_pid, Config), + gen_event:stop(Pid); +end_per_testcase(_Case, _Config) -> + ok. %% -------------------------------------- %% Start an event manager. %% -------------------------------------- -start(doc) -> []; -start(suite) -> []; +-define(LMGR, {local, my_dummy_name}). +-define(GMGR, {global, my_dummy_name}). + start(Config) when is_list(Config) -> OldFl = process_flag(trap_exit, true), - ?line dummy_via:reset(), - - ?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, Pid5} = gen_event:start_link({via, dummy_via, my_dummy_name}), - ?line [] = gen_event:which_handlers({via, dummy_via, my_dummy_name}), - ?line [] = gen_event:which_handlers(Pid5), - ?line ok = gen_event:stop({via, dummy_via, 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, Pid6} = 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}), - - ok = gen_event:stop({global, my_dummy_name}, shutdown, 10000), + dummy_via:reset(), + + {ok, Pid0} = gen_event:start(), %anonymous + [] = gen_event:which_handlers(Pid0), + ok = gen_event:stop(Pid0), + + {ok, Pid1} = gen_event:start_link(), %anonymous + [] = gen_event:which_handlers(Pid1), + ok = gen_event:stop(Pid1), + + {ok, Pid2} = gen_event:start(?LMGR), + [] = gen_event:which_handlers(my_dummy_name), + [] = gen_event:which_handlers(Pid2), + ok = gen_event:stop(my_dummy_name), + + {ok, Pid3} = gen_event:start_link(?LMGR), + [] = gen_event:which_handlers(my_dummy_name), + [] = gen_event:which_handlers(Pid3), + ok = gen_event:stop(my_dummy_name), + + {ok, Pid4} = gen_event:start_link(?GMGR), + [] = gen_event:which_handlers(?GMGR), + [] = gen_event:which_handlers(Pid4), + ok = gen_event:stop(?GMGR), + + {ok, Pid5} = gen_event:start_link({via, dummy_via, my_dummy_name}), + [] = gen_event:which_handlers({via, dummy_via, my_dummy_name}), + [] = gen_event:which_handlers(Pid5), + ok = gen_event:stop({via, dummy_via, my_dummy_name}), + + {ok, _} = gen_event:start_link(?LMGR), + {error, {already_started, _}} = gen_event:start_link(?LMGR), + {error, {already_started, _}} = gen_event:start(?LMGR), + ok = gen_event:stop(my_dummy_name), + + {ok, Pid6} = gen_event:start_link(?GMGR), + {error, {already_started, _}} = gen_event:start_link(?GMGR), + {error, {already_started, _}} = gen_event:start(?GMGR), + + ok = gen_event:stop(?GMGR, shutdown, 10000), receive {'EXIT', Pid6, shutdown} -> ok after 10000 -> - ?t:fail(exit_gen_event) + ct:fail(exit_gen_event) end, - ?line {ok, Pid7} = gen_event:start_link({via, dummy_via, my_dummy_name}), - ?line {error, {already_started, _}} = - gen_event:start_link({via, dummy_via, my_dummy_name}), - ?line {error, {already_started, _}} = - gen_event:start({via, dummy_via, my_dummy_name}), + {ok, Pid7} = gen_event:start_link({via, dummy_via, my_dummy_name}), + {error, {already_started, _}} = gen_event:start_link({via, dummy_via, my_dummy_name}), + {error, {already_started, _}} = gen_event:start({via, dummy_via, my_dummy_name}), exit(Pid7, shutdown), receive {'EXIT', Pid7, shutdown} -> ok after 10000 -> - ?t:fail(exit_gen_event) + ct:fail(exit_gen_event) end, - ?t:messages_get(), process_flag(trap_exit, OldFl), ok. +start_opt(Config) when is_list(Config) -> + OldFl = process_flag(trap_exit, true), + + dummy_via:reset(), + + {ok, Pid0} = gen_event:start([]), %anonymous + [] = gen_event:which_handlers(Pid0), + ok = gen_event:stop(Pid0), + + {ok, Pid1} = gen_event:start_link([]), %anonymous + [] = gen_event:which_handlers(Pid1), + ok = gen_event:stop(Pid1), + + {ok, Pid2} = gen_event:start(?LMGR, []), + [] = gen_event:which_handlers(my_dummy_name), + [] = gen_event:which_handlers(Pid2), + ok = gen_event:stop(my_dummy_name), + + {ok, Pid3} = gen_event:start_link(?LMGR, []), + [] = gen_event:which_handlers(my_dummy_name), + [] = gen_event:which_handlers(Pid3), + ok = gen_event:stop(my_dummy_name), + + {ok, Pid4} = gen_event:start_link(?GMGR, []), + [] = gen_event:which_handlers(?GMGR), + [] = gen_event:which_handlers(Pid4), + ok = gen_event:stop(?GMGR), + + {ok, Pid5} = gen_event:start_link({via, dummy_via, my_dummy_name}, []), + [] = gen_event:which_handlers({via, dummy_via, my_dummy_name}), + [] = gen_event:which_handlers(Pid5), + ok = gen_event:stop({via, dummy_via, my_dummy_name}), + + {ok, _} = gen_event:start_link(?LMGR, []), + {error, {already_started, _}} = gen_event:start_link(?LMGR, []), + {error, {already_started, _}} = gen_event:start(?LMGR, []), + ok = gen_event:stop(my_dummy_name), + + {ok, Pid7} = gen_event:start_link(?GMGR), + {error, {already_started, _}} = gen_event:start_link(?GMGR, []), + {error, {already_started, _}} = gen_event:start(?GMGR, []), + + ok = gen_event:stop(?GMGR, shutdown, 10000), + receive + {'EXIT', Pid7, shutdown} -> ok + after 10000 -> + ct:fail(exit_gen_event) + end, + + {ok, Pid8} = gen_event:start_link({via, dummy_via, my_dummy_name}), + {error, {already_started, _}} = gen_event:start_link({via, dummy_via, my_dummy_name}, []), + {error, {already_started, _}} = gen_event:start({via, dummy_via, my_dummy_name}, []), + + exit(Pid8, shutdown), + receive + {'EXIT', Pid8, shutdown} -> ok + after 10000 -> + ct:fail(exit_gen_event) + end, + + %% test spawn_opt + MinHeapSz = 10000, + {ok, Pid9} = gen_event:start_link(?LMGR, [{spawn_opt, [{min_heap_size, MinHeapSz}]}]), + {error, {already_started, _}} = gen_event:start_link(?LMGR, []), + {error, {already_started, _}} = gen_event:start(?LMGR, []), + {heap_size, HeapSz} = erlang:process_info(Pid9, heap_size), + true = HeapSz > MinHeapSz, + ok = gen_event:stop(my_dummy_name), + + %% test debug opt + {ok, _} = gen_event:start_link(?LMGR, [{debug,[debug]}]), + {error, {already_started, _}} = gen_event:start_link(?LMGR, []), + {error, {already_started, _}} = gen_event:start(?LMGR, []), + ok = gen_event:stop(my_dummy_name), + + process_flag(trap_exit, OldFl), + ok. hibernate(Config) when is_list(Config) -> {ok,Pid} = gen_event:start({local, my_dummy_handler}), @@ -184,7 +292,7 @@ hibernate(Config) when is_list(Config) -> {ok,Pid2} = gen_event:start({local, my_dummy_handler}), ok = gen_event:add_handler(my_dummy_handler, dummy_h, - [self(),hibernate]), + [self(),hibernate]), is_in_erlang_hibernate(Pid2), sys:suspend(my_dummy_handler), is_in_erlang_hibernate(Pid2), @@ -193,18 +301,60 @@ hibernate(Config) when is_list(Config) -> Pid2 ! wake, is_not_in_erlang_hibernate(Pid2), - + ok = gen_event:stop(my_dummy_handler), ok. +auto_hibernate(Config) when is_list(Config) -> + HibernateAfterTimeout = 100, + State = {auto_hibernate_state}, + {ok,Pid} = gen_event:start({local, auto_hibernate_handler}, [{hibernate_after, HibernateAfterTimeout}]), + %% After init test + is_not_in_erlang_hibernate(Pid), + timer:sleep(HibernateAfterTimeout), + is_in_erlang_hibernate(Pid), + ok = gen_event:add_handler(auto_hibernate_handler, dummy_h, [State]), + %% Get state test + [{dummy_h,false,State}] = sys:get_state(Pid), + is_in_erlang_hibernate(Pid), + %% Call test + {ok, hejhopp} = gen_event:call(auto_hibernate_handler, dummy_h, hejsan), + is_not_in_erlang_hibernate(Pid), + timer:sleep(HibernateAfterTimeout), + is_in_erlang_hibernate(Pid), + %% Event test + ok = gen_event:notify(auto_hibernate_handler, {self(), handle_event}), + receive + handled_event -> + ok + after 1000 -> + ct:fail(event) + end, + is_not_in_erlang_hibernate(Pid), + timer:sleep(HibernateAfterTimeout), + is_in_erlang_hibernate(Pid), + %% Info test + Pid ! {self(), handle_info}, + receive + handled_info -> + ok + after 1000 -> + ct:fail(info) + end, + is_not_in_erlang_hibernate(Pid), + timer:sleep(HibernateAfterTimeout), + is_in_erlang_hibernate(Pid), + ok = gen_event:stop(auto_hibernate_handler), + ok. + is_in_erlang_hibernate(Pid) -> receive after 1 -> ok end, is_in_erlang_hibernate_1(200, Pid). is_in_erlang_hibernate_1(0, Pid) -> io:format("~p\n", [erlang:process_info(Pid, current_function)]), - ?t:fail(not_in_erlang_hibernate_3); + ct:fail(not_in_erlang_hibernate_3); is_in_erlang_hibernate_1(N, Pid) -> {current_function,MFA} = erlang:process_info(Pid, current_function), case MFA of @@ -221,7 +371,7 @@ is_not_in_erlang_hibernate(Pid) -> is_not_in_erlang_hibernate_1(0, Pid) -> io:format("~p\n", [erlang:process_info(Pid, current_function)]), - ?t:fail(not_in_erlang_hibernate_3); + ct:fail(not_in_erlang_hibernate_3); is_not_in_erlang_hibernate_1(N, Pid) -> {current_function,MFA} = erlang:process_info(Pid, current_function), case MFA of @@ -233,731 +383,694 @@ is_not_in_erlang_hibernate_1(N, Pid) -> end. -add_handler(doc) -> []; -add_handler(suite) -> []; add_handler(Config) when is_list(Config) -> - ?line {ok,_} = gen_event:start({local, my_dummy_handler}), - ?line {error, my_error} = + {ok,_} = gen_event:start({local, my_dummy_handler}), + {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), + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), - ?line {error, my_error} = + {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()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,self()}, + [self()]), Self = self(), - ?line [{dummy_h, Self}, dummy_h] = + [{dummy_h, Self}, dummy_h] = gen_event:which_handlers(my_dummy_handler), - ?line ok = gen_event:stop(my_dummy_handler), + ok = gen_event:stop(my_dummy_handler), ok. -add_sup_handler(doc) -> []; -add_sup_handler(suite) -> []; add_sup_handler(Config) when is_list(Config) -> - ?line {ok,Pid} = gen_event:start({local, my_dummy_handler}), - ?line {error, my_error} = + {ok,Pid} = gen_event:start({local, my_dummy_handler}), + {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), + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + exit(Pid, sup_died), + ct:sleep(1000), + [] = 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), + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), - ?line {error, my_error} = + {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()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_sup_handler(my_dummy_handler, {dummy_h,self()}, + [self()]), Self = self(), - ?line [{dummy_h, Self}, dummy_h] = + [{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 = gen_event:stop(my_dummy_handler), + + receive + {gen_event_EXIT, dummy_h, shutdown} -> + ok + after 1000 -> + ct:fail({no,{gen_event_EXIT, dummy_h, shutdown}}) + end, + + receive + {gen_event_EXIT, {dummy_h,Self}, shutdown} -> + ok + after 1000 -> + ct:fail({no,{gen_event_EXIT, {dummy_h,Self}, + shutdown}}) + end, ok. -delete_handler(doc) -> []; -delete_handler(suite) -> []; delete_handler(Config) when is_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} = + {ok,_} = gen_event:start({local, my_dummy_handler}), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + {error, module_not_found} = gen_event:delete_handler(my_dummy_handler, duuuuuuuuumy, []), - ?line return_hej = + 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:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ok = gen_event:delete_handler(my_dummy_handler, dummy_h, []), - ?line [] = gen_event:which_handlers(my_dummy_handler), + [] = 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} = + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,2}, [self()]), + {error, module_not_found} = gen_event:delete_handler(my_dummy_handler, {duuuuuuuuumy,1}, []), - ?line return_hej = + return_hej = gen_event:delete_handler(my_dummy_handler, {dummy_h,1}, return_hej), - ?line return_hej = + 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:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,2}, [self()]), + ok = gen_event:delete_handler(my_dummy_handler, {dummy_h,2}, []), - ?line [] = gen_event:which_handlers(my_dummy_handler), + [] = gen_event:which_handlers(my_dummy_handler), - ?line ok = gen_event:stop(my_dummy_handler), + ok = gen_event:stop(my_dummy_handler), ok. -swap_handler(doc) -> []; -swap_handler(suite) -> []; swap_handler(Config) when is_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} = + {ok,_} = gen_event:start({local, my_dummy_handler}), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + {error, non_existing} = gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, {dummy1_h, []}), - ?line ok = + ok = gen_event:swap_handler(my_dummy_handler, {dummy_h, swap}, {dummy1_h, swap}), - ?line [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), - ?line ok = gen_event:delete_handler(my_dummy_handler, dummy1_h, []), + 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} = + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + {error, non_existing} = gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, {dummy1_h, []}), - ?line ok = + 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), + [{dummy1_h,4}] = gen_event:which_handlers(my_dummy_handler), - ?line ok = gen_event:delete_handler(my_dummy_handler, {dummy1_h,4}, []), + ok = gen_event:delete_handler(my_dummy_handler, {dummy1_h,4}, []), - ?line ok = gen_event:stop(my_dummy_handler), + ok = gen_event:stop(my_dummy_handler), ok. - -swap_sup_handler(doc) -> []; -swap_sup_handler(suite) -> []; + swap_sup_handler(Config) when is_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} = + {ok,_} = gen_event:start({local, my_dummy_handler}), + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + {error, non_existing} = gen_event:swap_handler(my_dummy_handler, {faulty_h, swap}, {dummy1_h, []}), - ?line ok = + 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} = + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:delete_handler(my_dummy_handler, dummy1_h, []), + receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + after 1000 -> + ct:fail({no,{gen_event_EXIT, dummy1_h, normal}}) + end, + + ok = gen_event:add_sup_handler(my_dummy_handler, {dummy_h,3}, + [self()]), + {error, non_existing} = gen_event:swap_sup_handler(my_dummy_handler, {faulty_h, swap}, {dummy1_h, []}), - ?line ok = + 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), + [{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, + ok = gen_event:delete_handler(my_dummy_handler, {dummy1_h,4}, []), + receive + {gen_event_EXIT, {dummy1_h,4}, normal} -> + ok + after 1000 -> + ct:fail({no,{gen_event_EXIT, {dummy1_h,4}, normal}}) + end, - ?line ok = gen_event:stop(my_dummy_handler), + ok = gen_event:stop(my_dummy_handler), ok. - -notify(doc) -> []; -notify(suite) -> []; + notify(Config) when is_list(Config) -> - ?line {ok,_} = gen_event:start({local, my_dummy_handler}), - ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + {ok,_} = gen_event:start({local, my_dummy_handler}), + 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), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:notify(my_dummy_handler, Event), + receive + {dummy_h, Event} -> + ok + end, + ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:notify(my_dummy_handler, Event), + receive + {dummy1_h, Event} -> + ok + end, + ok = gen_event:notify(my_dummy_handler, delete_event), + receive + {dummy1_h, removed} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ok = gen_event:notify(my_dummy_handler, error_event), + receive + {dummy_h, returned_error} -> + ok + end, + [] = 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), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,5}, [self()]), + [{dummy_h,5}] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:notify(my_dummy_handler, Event), + receive + {dummy_h, Event} -> + ok + end, + ok = gen_event:notify(my_dummy_handler, + {swap_event, {dummy1_h, 9}, swap}), + [{dummy1_h,9}] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:notify(my_dummy_handler, Event), + receive + {dummy1_h, Event} -> + ok + end, + ok = gen_event:notify(my_dummy_handler, delete_event), + receive + {dummy1_h, removed} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,a}, [self()]), + + ok = gen_event:notify(my_dummy_handler, error_event), + receive + {dummy_h, returned_error} -> + ok + end, + [] = 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 = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:notify(my_dummy_handler, Event), + receive + {dummy_h, Event} -> + ok + end, + + ok = gen_event:notify(my_dummy_handler, do_crash), + receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + end, + + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:notify(my_dummy_handler, do_crash), + receive + {gen_event_EXIT, dummy1_h, {'EXIT',_}} -> + ok + end, + + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ok = gen_event:notify(my_dummy_handler, {swap_event,dummy1_h,swap}), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:notify(my_dummy_handler, delete_event), + receive + {dummy1_h, removed} -> + ok + end, + + receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + end, + + [] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:stop(my_dummy_handler), ok. -sync_notify(doc) -> []; -sync_notify(suite) -> []; sync_notify(Config) when is_list(Config) -> - ?line {ok,_} = gen_event:start({local, my_dummy_handler}), - ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + {ok,_} = gen_event:start({local, my_dummy_handler}), + 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), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:sync_notify(my_dummy_handler, Event), + receive + {dummy_h, Event} -> + ok + end, + ok = gen_event:sync_notify(my_dummy_handler, + {swap_event, dummy1_h, swap}), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:sync_notify(my_dummy_handler, Event), + receive + {dummy1_h, Event} -> + ok + end, + ok = gen_event:sync_notify(my_dummy_handler, delete_event), + receive + {dummy1_h, removed} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + ok = gen_event:sync_notify(my_dummy_handler, error_event), + receive + {dummy_h, returned_error} -> + ok + end, + [] = 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), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,5}, [self()]), + [{dummy_h,5}] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:sync_notify(my_dummy_handler, Event), + receive + {dummy_h, Event} -> + ok + end, + ok = gen_event:sync_notify(my_dummy_handler, + {swap_event, {dummy1_h, 9}, swap}), + [{dummy1_h,9}] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:sync_notify(my_dummy_handler, Event), + receive + {dummy1_h, Event} -> + ok + end, + ok = gen_event:sync_notify(my_dummy_handler, delete_event), + receive + {dummy1_h, removed} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,a}, [self()]), + + ok = gen_event:sync_notify(my_dummy_handler, error_event), + receive + {dummy_h, returned_error} -> + ok + end, + [] = 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 = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:sync_notify(my_dummy_handler, Event), + receive + {dummy_h, Event} -> + ok + end, + + ok = gen_event:sync_notify(my_dummy_handler, do_crash), + receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + end, + + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ok = gen_event:sync_notify(my_dummy_handler, + {swap_event,dummy1_h,swap}), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:sync_notify(my_dummy_handler, do_crash), + receive + {gen_event_EXIT, dummy1_h, {'EXIT',_}} -> + ok + end, + + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + ok = gen_event:sync_notify(my_dummy_handler, + {swap_event,dummy1_h,swap}), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:sync_notify(my_dummy_handler, delete_event), + receive + {dummy1_h, removed} -> + ok + end, + + receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + end, + + [] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:stop(my_dummy_handler), ok. -call(doc) -> []; -call(suite) -> []; call(Config) when is_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} = + {ok,_} = gen_event:start({local, my_dummy_handler}), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h, 1}, [self()]), + [{dummy_h, 1}, dummy_h] = gen_event:which_handlers(my_dummy_handler), + {'EXIT',_} = (catch gen_event:call(non_exist, dummy_h, hejsan)), + {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, _}} = + {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan), + {ok, hejhopp} = gen_event:call(my_dummy_handler, {dummy_h, 1}, + hejsan), + {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan, + 10000), + {'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} = + ok = gen_event:delete_handler(my_dummy_handler, {dummy_h, 1}, []), + {ok, swapped} = gen_event:call(my_dummy_handler, dummy_h, + {swap_call,dummy1_h,swap}), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + {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}} = + ok = gen_event:call(my_dummy_handler, dummy1_h, delete_call), + receive + {dummy1_h, removed} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + {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', _}} = + receive + {dummy_h, returned_error} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + {error, {'EXIT', _}} = gen_event:call(my_dummy_handler, dummy_h, exit_call), - ?line [] = gen_event:which_handlers(my_dummy_handler), + [] = 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} = + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + [{dummy_h,1}] = gen_event:which_handlers(my_dummy_handler), + {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} = + {ok, hejhopp} = gen_event:call(my_dummy_handler, {dummy_h,1}, + hejsan), + {ok, swapped} = gen_event:call(my_dummy_handler, {dummy_h,1}, + {swap_call,{dummy1_h,2},swap}), + [{dummy1_h,2}] = gen_event:which_handlers(my_dummy_handler), + {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}} = + ok = gen_event:call(my_dummy_handler, {dummy1_h,2}, delete_call), + receive + {dummy1_h, removed} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + + {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', _}} = + receive + {dummy_h, returned_error} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,4}, [self()]), + + {error, {'EXIT', _}} = gen_event:call(my_dummy_handler, {dummy_h,4}, exit_call), - ?line [] = gen_event:which_handlers(my_dummy_handler), + [] = 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} = + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + {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} = + {ok, hejhopp} = gen_event:call(my_dummy_handler, dummy_h, hejsan), + {ok, swapped} = gen_event:call(my_dummy_handler, dummy_h, + {swap_call,dummy1_h,swap}), + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + {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, + ok = gen_event:call(my_dummy_handler, dummy1_h, delete_call), + receive + {dummy1_h, removed} -> + ok + end, - ?line receive - {gen_event_EXIT, dummy1_h, normal} -> - ok - end, + 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()]), + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), - ?line {error, {return, faulty}} = + {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', _}} = + receive + {dummy_h, returned_error} -> + ok + end, + + receive + {gen_event_EXIT, dummy_h, {return,faulty}} -> + ok + after 1000 -> + ct:fail({no, {gen_event_EXIT, dummy_h, {return,faulty}}}) + end, + + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + + {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, + receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + after 1000 -> + ct:fail({no, {gen_event_EXIT, dummy_h, {'EXIT','_'}}}) + end, - ?line [] = gen_event:which_handlers(my_dummy_handler), + [] = gen_event:which_handlers(my_dummy_handler), - ?line ok = gen_event:stop(my_dummy_handler), + ok = gen_event:stop(my_dummy_handler), ok. flush() -> receive _ -> flush() after 0 -> ok end. -info(doc) -> []; -info(suite) -> []; info(Config) when is_list(Config) -> - ?line {ok,_} = gen_event:start({local, my_dummy_handler}), - ?line ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + {ok,_} = gen_event:start({local, my_dummy_handler}), + 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), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + my_dummy_handler ! Info, + receive + {dummy_h, Info} -> + ok + end, + my_dummy_handler ! {swap_info,dummy1_h,swap}, + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + my_dummy_handler ! Info, + receive + {dummy1_h, Info} -> + ok + end, + my_dummy_handler ! delete_info, + receive + {dummy1_h, removed} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, dummy_h, [self()]), + + my_dummy_handler ! error_info, + receive + {dummy_h, returned_error} -> + ok + end, + [] = 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), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,1}, [self()]), + [{dummy_h,1}] = gen_event:which_handlers(my_dummy_handler), + my_dummy_handler ! Info, + receive + {dummy_h, Info} -> + ok + end, + my_dummy_handler ! {swap_info,{dummy1_h,2},swap}, + [{dummy1_h,2}] = gen_event:which_handlers(my_dummy_handler), + my_dummy_handler ! Info, + receive + {dummy1_h, Info} -> + ok + end, + my_dummy_handler ! delete_info, + receive + {dummy1_h, removed} -> + ok + end, + [] = gen_event:which_handlers(my_dummy_handler), + ok = gen_event:add_handler(my_dummy_handler, {dummy_h,3}, [self()]), + + my_dummy_handler ! error_info, + receive + {dummy_h, returned_error} -> + ok + end, + [] = 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 = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + [dummy_h] = gen_event:which_handlers(my_dummy_handler), + my_dummy_handler ! Info, + receive + {dummy_h, Info} -> + ok + end, + my_dummy_handler ! {swap_info,dummy1_h,swap}, + [dummy1_h] = gen_event:which_handlers(my_dummy_handler), + my_dummy_handler ! Info, + receive + {dummy1_h, Info} -> + ok + end, + my_dummy_handler ! delete_info, + receive + {dummy1_h, removed} -> + ok + end, + + receive + {gen_event_EXIT, dummy1_h, normal} -> + ok + after 1000 -> + ct:fail({no, {gen_event_EXIT, dummy1_h, normal}}) + end, + + [] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + + my_dummy_handler ! error_info, + receive + {dummy_h, returned_error} -> + ok + end, + + receive + {gen_event_EXIT, dummy_h, {return,faulty}} -> + ok + after 1000 -> + ct:fail({no, {gen_event_EXIT, dummy_h, {return,faulty}}}) + end, + + ok = gen_event:add_sup_handler(my_dummy_handler, dummy_h, [self()]), + my_dummy_handler ! do_crash, + + receive + {gen_event_EXIT, dummy_h, {'EXIT',_}} -> + ok + after 1000 -> + ct:fail({no, {gen_event_EXIT, dummy_h, {'EXIT','_'}}}) + end, + + [] = gen_event:which_handlers(my_dummy_handler), + + ok = gen_event:stop(my_dummy_handler), ok. -call_format_status(suite) -> - []; -call_format_status(doc) -> - ["Test that sys:get_status/1,2 calls format_status/2"]; +%% Test that sys:get_status/1,2 calls format_status/2. call_format_status(Config) when is_list(Config) -> - ?line {ok, Pid} = gen_event:start({local, my_dummy_handler}), + {ok, Pid} = gen_event:start({local, my_dummy_handler}), %% State here intentionally differs from what we expect from format_status State = self(), FmtState = "dummy1_h handler state", - ?line ok = gen_event:add_handler(my_dummy_handler, dummy1_h, [State]), - ?line Status1 = sys:get_status(Pid), - ?line Status2 = sys:get_status(Pid, 5000), - ?line ok = gen_event:stop(Pid), - ?line {status, Pid, _, [_, _, Pid, [], Data1]} = Status1, - ?line HandlerInfo1 = proplists:get_value(items, Data1), - ?line {"Installed handlers", [{_,dummy1_h,_,FmtState,_}]} = HandlerInfo1, - ?line {status, Pid, _, [_, _, Pid, [], Data2]} = Status2, - ?line HandlerInfo2 = proplists:get_value(items, Data2), - ?line {"Installed handlers", [{_,dummy1_h,_,FmtState,_}]} = HandlerInfo2, + ok = gen_event:add_handler(my_dummy_handler, dummy1_h, [State]), + Status1 = sys:get_status(Pid), + Status2 = sys:get_status(Pid, 5000), + ok = gen_event:stop(Pid), + {status, Pid, _, [_, _, Pid, [], Data1]} = Status1, + HandlerInfo1 = proplists:get_value(items, Data1), + {"Installed handlers", [{_,dummy1_h,_,FmtState,_}]} = HandlerInfo1, + {status, Pid, _, [_, _, Pid, [], Data2]} = Status2, + HandlerInfo2 = proplists:get_value(items, Data2), + {"Installed handlers", [{_,dummy1_h,_,FmtState,_}]} = HandlerInfo2, ok. -call_format_status_anon(suite) -> - []; -call_format_status_anon(doc) -> - ["Test that sys:get_status/1,2 calls format_status/2 for anonymous gen_event processes"]; +%% Test that sys:get_status/1,2 calls format_status/2 for anonymous +%% gen_event processes. call_format_status_anon(Config) when is_list(Config) -> - ?line {ok, Pid} = gen_event:start(), + {ok, Pid} = gen_event:start(), %% The 'Name' of the gen_event process will be a pid() here, so %% the next line will crash if format_status can't string-ify pids. - ?line Status1 = sys:get_status(Pid), - ?line ok = gen_event:stop(Pid), + Status1 = sys:get_status(Pid), + ok = gen_event:stop(Pid), Header = "Status for event handler " ++ pid_to_list(Pid), - ?line {status, Pid, _, [_, _, Pid, [], Data1]} = Status1, - ?line Header = proplists:get_value(header, Data1), + {status, Pid, _, [_, _, Pid, [], Data1]} = Status1, + Header = proplists:get_value(header, Data1), ok. -error_format_status(suite) -> - []; -error_format_status(doc) -> - ["Test that a handler error calls format_status/2"]; +%% Test that a handler error calls format_status/2. error_format_status(Config) when is_list(Config) -> - ?line error_logger_forwarder:register(), + error_logger_forwarder:register(), OldFl = process_flag(trap_exit, true), State = self(), - ?line {ok, Pid} = gen_event:start({local, my_dummy_handler}), - ?line ok = gen_event:add_sup_handler(my_dummy_handler, dummy1_h, [State]), - ?line ok = gen_event:notify(my_dummy_handler, do_crash), - ?line receive - {gen_event_EXIT,dummy1_h,{'EXIT',_}} -> ok - after 5000 -> - ?t:fail(exit_gen_event) - end, + {ok, Pid} = gen_event:start({local, my_dummy_handler}), + ok = gen_event:add_sup_handler(my_dummy_handler, dummy1_h, [State]), + ok = gen_event:notify(my_dummy_handler, do_crash), + receive + {gen_event_EXIT,dummy1_h,{'EXIT',_}} -> ok + after 5000 -> + ct:fail(exit_gen_event) + end, FmtState = "dummy1_h handler state", receive {error,_GroupLeader, {Pid, @@ -966,18 +1079,14 @@ error_format_status(Config) when is_list(Config) -> FmtState, _]}} -> ok; Other -> - ?line io:format("Unexpected: ~p", [Other]), - ?line ?t:fail() + io:format("Unexpected: ~p", [Other]), + ct:fail(failed) end, - ?t:messages_get(), - ?line ok = gen_event:stop(Pid), + ok = gen_event:stop(Pid), process_flag(trap_exit, OldFl), ok. -get_state(suite) -> - []; -get_state(doc) -> - ["Test that sys:get_state/1,2 return the gen_event state"]; +%% Test that sys:get_state/1,2 return the gen_event state. get_state(Config) when is_list(Config) -> {ok, Pid} = gen_event:start({local, my_dummy_handler}), State1 = self(), @@ -997,10 +1106,7 @@ get_state(Config) when is_list(Config) -> ok = gen_event:stop(Pid), ok. -replace_state(suite) -> - []; -replace_state(doc) -> - ["Test that replace_state/2,3 replace the gen_event state"]; +%% Test that replace_state/2,3 replace the gen_event state. replace_state(Config) when is_list(Config) -> {ok, Pid} = gen_event:start({local, my_dummy_handler}), State1 = self(), @@ -1026,3 +1132,92 @@ replace_state(Config) when is_list(Config) -> ok = sys:resume(Pid), [{dummy1_h,false,NState3}] = sys:get_state(Pid), ok. + +%% No default provided for init, so it should fail +undef_init(Config) -> + Pid = ?config(event_pid, Config), + {'EXIT', {undef, [{oc_init_event, init, [_], _}|_]}} + = gen_event:add_handler(Pid, oc_init_event, []), + ok. + +%% No default provided for init, so it should fail +undef_handle_call(Config) when is_list(Config) -> + Pid = ?config(event_pid, Config), + {error, {'EXIT', {undef, [{oc_event, handle_call, _, _}|_]}}} + = gen_event:call(Pid, oc_event, call_msg), + [] = gen_event:which_handlers(Pid), + ok. + +%% No default provided for init, so it should fail +undef_handle_event(Config) -> + Pid = ?config(event_pid, Config), + ok = gen_event:sync_notify(Pid, event_msg), + [] = gen_event:which_handlers(Pid), + + gen_event:add_handler(oc_event, oc_event, []), + [oc_event] = gen_event:which_handlers(Pid), + + ok = gen_event:notify(Pid, event_msg), + [] = gen_event:which_handlers(Pid), + ok. + +%% Defaulting to doing nothing with a log warning. +undef_handle_info(Config) when is_list(Config) -> + error_logger_forwarder:register(), + Pid = ?config(event_pid, Config), + Pid ! hej, + wait_until_processed(Pid, hej, 10), + [oc_event] = gen_event:which_handlers(Pid), + receive + {warning_msg, _GroupLeader, + {Pid, "** Undefined handle_info in " ++ _, [oc_event, hej]}} -> + ok; + Other -> + io:format("Unexpected: ~p", [Other]), + ct:fail(failed) + end. + +wait_until_processed(_Pid, _Message, 0) -> + ct:fail(not_processed); +wait_until_processed(Pid, Message, N) -> + {messages, Messages} = erlang:process_info(Pid, messages), + case lists:member(Message, Messages) of + true -> + timer:sleep(100), + wait_until_processed(Pid, Message, N-1); + false -> + ok + end. + +%% No default provided for init, so it should fail +undef_code_change(Config) when is_list(Config) -> + Pid = ?config(event_pid, Config), + {error, {'EXIT', {undef, [{oc_event, code_change, [_, _, _], _}|_]}}} = + fake_upgrade(Pid, oc_event), + [oc_event] = gen_event:which_handlers(Pid), + ok. + +%% Defaulting to doing nothing. Test that it works when not defined. +undef_terminate(Config) when is_list(Config) -> + Pid = ?config(event_pid, Config), + ok = gen_event:delete_handler(Pid, oc_event, []), + [] = gen_event:which_handlers(Pid), + ok. + +%% Test that the default implementation doesn't catch the wrong undef error +undef_in_terminate(_Config) -> + {ok, Pid} = gen_event:start({local, dummy}), + State = {undef_in_terminate, {dummy_h, terminate}}, + ok = gen_event:add_handler(Pid, dummy_h, {state, State}), + [dummy_h] = gen_event:which_handlers(Pid), + {'EXIT', {undef, [{dummy_h, terminate, [], []}|_]}} + = gen_event:delete_handler(Pid, dummy_h, []), + [] = gen_event:which_handlers(Pid), + ok. + +fake_upgrade(Pid, Mod) -> + sys:suspend(Pid), + sys:replace_state(Pid, fun(S) -> {new, S} end), + Ret = sys:change_code(Pid, Mod, old_vsn, []), + ok = sys:resume(Pid), + Ret. |