1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2011-2016. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20-module(alarm_handler_SUITE).
21
22-include_lib("common_test/include/ct.hrl").
23
24%%-----------------------------------------------------------------
25%% We will add an own alarm handler in order to verify that the
26%% alarm_handler deliver the expected events.
27%%-----------------------------------------------------------------
28
29-export([init_per_suite/1, end_per_suite/1, all/0,groups/0,
30	 init_per_group/2,end_per_group/2,
31	 set_alarm/1, clear_alarm/1, swap/1]).
32
33-export([init/1, handle_event/2, handle_call/2, handle_info/2,
34	 terminate/2]).
35
36
37init_per_suite(Config) ->
38    application:start(sasl),
39    Config.
40
41end_per_suite(_Config) ->
42    ok.
43
44all() ->
45    [set_alarm, clear_alarm, swap].
46
47groups() ->
48    [].
49
50init_per_group(_GroupName, Config) ->
51    Config.
52
53end_per_group(_GroupName, Config) ->
54    Config.
55
56
57
58%%-----------------------------------------------------------------
59
60set_alarm(Config) when is_list(Config) ->
61    gen_event:add_handler(alarm_handler, ?MODULE, self()),
62    Alarm1 = {alarm1, "this is the alarm"},
63    Alarm2 = {"alarm2", this_is_the_alarm},
64    Alarm3 = {{alarm3}, {this_is,"the_alarm"}},
65    ok = alarm_handler:set_alarm(Alarm1),
66    reported(set_alarm, Alarm1),
67    ok = alarm_handler:set_alarm(Alarm2),
68    reported(set_alarm, Alarm2),
69    ok = alarm_handler:set_alarm(Alarm3),
70    reported(set_alarm, Alarm3),
71
72    [Alarm3,Alarm2,Alarm1] = alarm_handler:get_alarms(),
73    alarm_handler:clear_alarm(alarm1),
74    alarm_handler:clear_alarm("alarm2"),
75    alarm_handler:clear_alarm({alarm3}),
76    [] = alarm_handler:get_alarms(),
77
78    test_server:messages_get(),
79    my_yes = gen_event:delete_handler(alarm_handler, ?MODULE, []),
80    ok.
81
82%%-----------------------------------------------------------------
83
84clear_alarm(Config) when is_list(Config) ->
85    gen_event:add_handler(alarm_handler, ?MODULE, self()),
86    Alarm1 = {alarm1, "this is the alarm"},
87    Alarm2 = {"alarm2", this_is_the_alarm},
88    Alarm3 = {{alarm3}, {this_is,"the_alarm"}},
89    alarm_handler:set_alarm(Alarm1),
90    alarm_handler:set_alarm(Alarm2),
91    alarm_handler:set_alarm(Alarm3),
92    test_server:messages_get(),
93
94    ok = alarm_handler:clear_alarm(alarm1),
95    reported(clear_alarm, alarm1),
96    ok = alarm_handler:clear_alarm("alarm2"),
97    reported(clear_alarm, "alarm2"),
98    ok = alarm_handler:clear_alarm({alarm3}),
99    reported(clear_alarm, {alarm3}),
100    [] = alarm_handler:get_alarms(),
101
102    my_yes = gen_event:delete_handler(alarm_handler, ?MODULE, []),
103    ok.
104
105%%-----------------------------------------------------------------
106
107swap(Config) when is_list(Config) ->
108    Alarm1 = {alarm1, "this is the alarm"},
109    Alarm2 = {"alarm2", this_is_the_alarm},
110    Alarm3 = {{alarm3}, {this_is,"the_alarm"}},
111    alarm_handler:set_alarm(Alarm1),
112    alarm_handler:set_alarm(Alarm2),
113    alarm_handler:set_alarm(Alarm3),
114
115    case gen_event:which_handlers(alarm_handler) of
116	[alarm_handler] ->
117	    ok = gen_event:swap_handler(alarm_handler,
118					{alarm_handler, swap},
119					{?MODULE, self()}),
120	    [?MODULE] = gen_event:which_handlers(alarm_handler),
121	    Alarms = [Alarm3, Alarm2, Alarm1],
122	    reported(swap_alarms, Alarms),
123
124	    %% get_alarms is only valid with the default handler installed.
125	    {error, _} = alarm_handler:get_alarms(),
126
127	    my_yes = gen_event:delete_handler(alarm_handler,
128					      ?MODULE, []),
129	    gen_event:add_handler(alarm_handler, alarm_handler, []),
130	    ok;
131	_ ->
132	    alarm_handler:clear_alarm(alarm1),
133            alarm_handler:clear_alarm("alarm2"),
134	    alarm_handler:clear_alarm({alarm3}),
135	    ok
136    end.
137
138%%-----------------------------------------------------------------
139%% Check that the alarm has been received.
140%%-----------------------------------------------------------------
141reported(Tag, Data) ->
142    receive
143	{Tag, Data} ->
144	    test_server:messages_get(),
145	    ok
146    after 1000 ->
147	    test_server:fail(no_alarm_received)
148    end.
149
150%%-----------------------------------------------------------------
151%% The error_logger handler (gen_event behaviour).
152%% Sends a notification to the Tester process about the events
153%% generated by the Tester process.
154%%-----------------------------------------------------------------
155init(Tester) when is_pid(Tester) ->
156    {ok, Tester};
157init({Tester, {alarm_handler,Alarms}}) -> % Swap from default handler.
158    Tester ! {swap_alarms, Alarms},
159    {ok, Tester}.
160
161handle_event({set_alarm, Alarm}, Tester) ->
162    Tester ! {set_alarm, Alarm},
163    {ok, Tester};
164handle_event({clear_alarm, AlarmId}, Tester) ->
165    Tester ! {clear_alarm, AlarmId},
166    {ok, Tester};
167handle_event(_Event, Tester) ->
168    {ok, Tester}.
169
170handle_info(_, Tester) ->
171    {ok, Tester}.
172
173handle_call(_Query, Tester) -> {ok, {error, bad_query}, Tester}.
174
175terminate(_Reason, _Tester) ->
176    my_yes.
177