%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2011. 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(alarm_handler_SUITE).
-include_lib("test_server/include/test_server.hrl").
%%-----------------------------------------------------------------
%% We will add an own alarm handler in order to verify that the
%% alarm_handler deliver the expected events.
%%-----------------------------------------------------------------
-export([init_per_suite/1, end_per_suite/1, all/0,groups/0,
init_per_group/2,end_per_group/2,
set_alarm/1, clear_alarm/1, swap/1]).
-export([init/1, handle_event/2, handle_call/2, handle_info/2,
terminate/2]).
init_per_suite(Config) ->
application:start(sasl),
Config.
end_per_suite(_Config) ->
ok.
all() ->
[set_alarm, clear_alarm, swap].
groups() ->
[].
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
%%-----------------------------------------------------------------
set_alarm(suite) -> [];
set_alarm(Config) when is_list(Config) ->
?line gen_event:add_handler(alarm_handler, ?MODULE, self()),
Alarm1 = {alarm1, "this is the alarm"},
Alarm2 = {"alarm2", this_is_the_alarm},
Alarm3 = {{alarm3}, {this_is,"the_alarm"}},
?line ok = alarm_handler:set_alarm(Alarm1),
reported(set_alarm, Alarm1),
?line ok = alarm_handler:set_alarm(Alarm2),
reported(set_alarm, Alarm2),
?line ok = alarm_handler:set_alarm(Alarm3),
reported(set_alarm, Alarm3),
?line [Alarm3,Alarm2,Alarm1] = alarm_handler:get_alarms(),
alarm_handler:clear_alarm(alarm1),
alarm_handler:clear_alarm("alarm2"),
alarm_handler:clear_alarm({alarm3}),
?line [] = alarm_handler:get_alarms(),
test_server:messages_get(),
?line my_yes = gen_event:delete_handler(alarm_handler, ?MODULE, []),
ok.
%%-----------------------------------------------------------------
clear_alarm(suite) -> [];
clear_alarm(Config) when is_list(Config) ->
?line gen_event:add_handler(alarm_handler, ?MODULE, self()),
Alarm1 = {alarm1, "this is the alarm"},
Alarm2 = {"alarm2", this_is_the_alarm},
Alarm3 = {{alarm3}, {this_is,"the_alarm"}},
alarm_handler:set_alarm(Alarm1),
alarm_handler:set_alarm(Alarm2),
alarm_handler:set_alarm(Alarm3),
test_server:messages_get(),
?line ok = alarm_handler:clear_alarm(alarm1),
reported(clear_alarm, alarm1),
?line ok = alarm_handler:clear_alarm("alarm2"),
reported(clear_alarm, "alarm2"),
?line ok = alarm_handler:clear_alarm({alarm3}),
reported(clear_alarm, {alarm3}),
?line [] = alarm_handler:get_alarms(),
?line my_yes = gen_event:delete_handler(alarm_handler, ?MODULE, []),
ok.
%%-----------------------------------------------------------------
swap(suite) -> [];
swap(Config) when is_list(Config) ->
?line Alarm1 = {alarm1, "this is the alarm"},
?line Alarm2 = {"alarm2", this_is_the_alarm},
?line Alarm3 = {{alarm3}, {this_is,"the_alarm"}},
?line alarm_handler:set_alarm(Alarm1),
?line alarm_handler:set_alarm(Alarm2),
?line alarm_handler:set_alarm(Alarm3),
?line foo,
case gen_event:which_handlers(alarm_handler) of
[alarm_handler] ->
?line ok = gen_event:swap_handler(alarm_handler,
{alarm_handler, swap},
{?MODULE, self()}),
?line [?MODULE] = gen_event:which_handlers(alarm_handler),
Alarms = [Alarm3, Alarm2, Alarm1],
reported(swap_alarms, Alarms),
%% get_alarms is only valid with the default handler installed.
?line {error, _} = alarm_handler:get_alarms(),
?line my_yes = gen_event:delete_handler(alarm_handler,
?MODULE, []),
?line gen_event:add_handler(alarm_handler, alarm_handler, []),
ok;
_ ->
alarm_handler:clear_alarm(alarm1),
alarm_handler:clear_alarm("alarm2"),
alarm_handler:clear_alarm({alarm3}),
ok
end.
%%-----------------------------------------------------------------
%% Check that the alarm has been received.
%%-----------------------------------------------------------------
reported(Tag, Data) ->
receive
{Tag, Data} ->
test_server:messages_get(),
ok
after 1000 ->
test_server:fail(no_alarm_received)
end.
%%-----------------------------------------------------------------
%% The error_logger handler (gen_event behaviour).
%% Sends a notification to the Tester process about the events
%% generated by the Tester process.
%%-----------------------------------------------------------------
init(Tester) when is_pid(Tester) ->
{ok, Tester};
init({Tester, {alarm_handler,Alarms}}) -> % Swap from default handler.
Tester ! {swap_alarms, Alarms},
{ok, Tester}.
handle_event({set_alarm, Alarm}, Tester) ->
Tester ! {set_alarm, Alarm},
{ok, Tester};
handle_event({clear_alarm, AlarmId}, Tester) ->
Tester ! {clear_alarm, AlarmId},
{ok, Tester};
handle_event(_Event, Tester) ->
{ok, Tester}.
handle_info(_, Tester) ->
{ok, Tester}.
handle_call(_Query, Tester) -> {ok, {error, bad_query}, Tester}.
terminate(_Reason, _Tester) ->
my_yes.